Compute,ComputeIfAbsent,ComputeIfPresent
簡介
Compute爲計算,即當前key的newValue值基於oldValue而得來,與merge方法類似,compute方法也可以自定義Function。
ComputeIfAbsent和ComputeIfPresent則是根據當前key是否存在,再做出compute的兩種衍生方法,大體意思與Compute一致。
default V compute(K key,
BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
Objects.requireNonNull(remappingFunction);
V oldValue = get(key);
V newValue = remappingFunction.apply(key, oldValue);
if (newValue == null) {
// delete mapping
if (oldValue != null || containsKey(key)) {
// something to remove
remove(key);
return null;
} else {
// nothing to do. Leave things as they were.
return null;
}
} else {
// add or replace old mapping
put(key, newValue);
return newValue;
}
}
Compute示例:
Map<String,StringBuffer> ve = new HashMap<>();
//向Map插入元素
ve.put("key",new StringBuffer("value1"));
System.out.println(ve);
ve.compute("key",(k,v)-> {
if (v == null) return new StringBuffer();
return v.append("dd");
});
ve.compute("key1",(k,v)-> new StringBuffer());
存在的key會走Function,不存在的key則會默認初始化
{key=value1}
{key1=, key=value1dd}
ComputeIfAbsent示例:
Map<String,StringBuffer> ve = new HashMap<>();
//向Map插入元素
ve.put("key",new StringBuffer("value1"));
ve.computeIfAbsent("keyAdd", k -> new StringBuffer());
ve.computeIfAbsent("key",k -> new StringBuffer());
存在的key不作處理,不存在的key按照function處理
{key=value1, keyAdd=}
ComputeIfPresent:
Map<String,StringBuffer> ve = new HashMap<>();
//向Map插入元素
ve.put("key",new StringBuffer("value1"));
ve.computeIfPresent("key",(K,V) -> V.append("dd"));
ve.computeIfPresent("key123",(K,V) -> V.append("dd"));
System.out.println(ve);
存在的key作處理,不存在的key不處理,默認的方法也不會執行
{key=value1dd}