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}