Merge
先鋪下源碼:
Merge意爲合併,這裏主要是針對Map多個key-value對進行處理,如果key存在,則執行value的merge方法,這裏merge方法是自己定義的,如果key不存在,則會根據默認值將key-value對put到Map中。
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;
}
這裏需要注意的是requireNonNull這兩個行,自定義的function和默認的value不能爲null ,下面兩種寫法都會拋出Exception in thread "main" java.lang.NullPointerException異常:
// 函數爲null
re.merge("key",3,null);
// value爲null
re.merge("key",null,(old,new_)-> old + new_);
使用示例:
先構造好Map
// merge 方法
Map<String, Integer> re = new HashMap<>();
// 向Map插入元素
re.put("A",1);
re.put("B",2);
最常用的是對key的累加操作,key存在則累加,key不存在則按初始化value put到Map:
// A 存在 對A的值累加
re.merge("A", 1,(old, new_)-> old + new_);
// C 不存在 按默認值1 put C->1
re.merge("C",1,(old, new_)-> old + new_);
// C 已存在 按function 此時爲乘法 進行元素merge
re.merge("C",3,(old, new_)-> old * new_);
結果:
Example:
這裏也可以自定義自己的函數,實現value的處理:
re.merge("C",3,(a,b)-> Merge(a,b));
// 針對merge方法
public static Integer Merge(Integer value1, Integer value2) {
return value1 + value2;
}
總結:
--> 只返回舊值 (old, new) -> new
--> 只返回新值(old, new) -> old
--> 合併兩者(old, new) -> Function(old, new)
--> 刪除舊值 (old, new) -> null