merge()
⭐源码:
default V merge(K key, V value,
BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
// 非空校验
Objects.requireNonNull(remappingFunction);
Objects.requireNonNull(value);
// 核心代码!
V oldValue = get(key);
V newValue = (oldValue == null) ? value :
remappingFunction.apply(oldValue, value);
if (newValue == null) {
remove(key);
} else {
put(key, newValue);
}
return newValue;
}
merge()
适用于两种情况:
- 如果 key 不存在,它就等价于 put(key, value) 。
- 如果 key 已经存在,我们 remappingFunction 可以选择合并的方式。
如果目前我想要把键为 i 的值进行 +1 操作,如果当前键不存在,则初始化值为 1 。如何实现呢?
假定 map 为 HashMap 的实例对象。
map.merge(i, 1, (old, new) -> old + new); // map.get(i)++
⭐解释:
map
: 这是一个Map
接口的实例,可以是HashMap
、TreeMap
等具体实现之一。i
: 这是要待查找或添加的键。1
: 这是与键i
关联的值,如果键i
尚不存在于哈希表中,则将此值作为初始值插入。(o1, o2) -> o1 + o2
: 这是一个Lambda表达式,实现了BiFunction<? super V, ? super V, ? extends V>
接口。这里,V
是哈希表泛型的类型。Lambda表达式接收两个参数:old
(当前哈希表中键i
的值,如果键不存在则为null
)和new
(要合并的值,在这个例子中是1
)。表达式的结果是将这两个值相加。