如果傳入的key對應的值爲空就使用新值替換null保存到Map中,如果Map中不包含該key,就將key和新值value保存到Map中。如果傳入的key對應的值不爲空,那麼就將該值和新傳入的值作爲計算函數remappingFunction的入參進行計算,返回計算後新的值。如果計算後的值爲空,就刪除該key,如果不爲空就將計算後的值代替舊值保存到Map中。
default V merge(K key, V value,BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
//強制傳入的計算方法remappingFunction不能爲空
Objects.requireNonNull(remappingFunction);
//強制傳入作爲的計算的值value不能爲空
Objects.requireNonNull(value);
//根據傳入的key獲取對應的值,存做舊值。
V oldValue = get(key);
//判斷舊值是否爲空,這裏包含兩種情況:1. Map中本來就不包含該key 2. 該key對應的值就是null
//如果舊oldValue值爲空,就使用傳入的value作爲新值,否則使用計算方法remappingFunction將舊值和新值作爲參數進行計算,返回計算結果作爲新值。
V newValue = (oldValue == null) ? value :
remappingFunction.apply(oldValue, value);
//如果新值爲空,就直接刪除該key,否則就將key和新值存入到Map中
if(newValue == null) {
remove(key);
} else {
put(key, newValue);
}
//最後返回新值
return newValue;
}