HashMap源码(7)computeIfPresent
文章目录
这个方法和computeIfAbsent这个都是Java8的新的内容,都是可以在添加map的时候添加一个方法来对key进行操作存储value。
代码:
public V computeIfPresent(K key,
BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
if (remappingFunction == null)
throw new NullPointerException();
Node<K,V> e; V oldValue;
int hash = hash(key);
if ((e = getNode(hash, key)) != null &&
(oldValue = e.value) != null) {
V v = remappingFunction.apply(key, oldValue);
if (v != null) {
e.value = v;
afterNodeAccess(e);
return v;
}
else
removeNode(hash, key, null, false, true);
}
return null;
}
这个方法和上一个方法不同的就是根据key来判断是否进行对value处理存储:
- 如果map中没有当前这个key就不进行处理
- 如果有这个key但是value是空的,也不会处理。
- 如果有这个key并且value不为空,则进行传入的那个方法,在方法处理最后的返回值。
- 如果返回值为空则删除这个key。
- 如果不为空那么久进行存储。
进行的相关代码和处理结果:
map中没有此key:
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("k","k");
map.computeIfPresent("j",(k,v)->genValue1(k,"me"));
System.out.println("map中没有相关key的时候:"+map);
}
static String genValue1(String k,String v){
System.out.println(k+v);
return k+v;
}
结果:
map中没有相关key的时候:{k=k}
map存储了一个相关key,value为null:
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("k","k");
map.put("j",null);
map.computeIfPresent("j",(k,v)->genValue1(k,"me"));
System.out.println("map中有相关key,但是value是null:"+map);
}
static String genValue1(String k,String v){
System.out.println(k+v);
return k+v;
}
结果:
map中有相关key,但是value是null:{j=null, k=k}
map存储了一个相关的key,value不为null,但是处理结果为null:
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("k","k");
map.put("j","m");
map.computeIfPresent("j",(k,v)->genValue1(k,":key+value"));
System.out.println("map中有相关key,value不是null,处理结果为null:"+map);
}
static String genValue1(String k,String v){
System.out.println(k+v);
return null;
}
结果:
j:key+value
map中有相关key,value不是null,处理结果为null:{k=k}
map存储了一个相关的key,value不为null,处理结果也不为null:
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("k","k");
map.put("j","m");
map.computeIfPresent("j",(k,v)->genValue1(k,":key+value"));
System.out.println("map中有相关key,value不是null,处理结果不为null:"+map);
}
static String genValue1(String k,String v){
System.out.println(k+v);
return k+v;
}
结果:
j:key+value
map中有相关key,value不是null,处理结果不为null:{j=j:key+value, k=k}