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
)。表达式的结果是将这两个值相加。