computeIfAbsent 是实现Map接口中的方法,功能如:
/*
* computeIfPresent功能:给定的key在hashMap中存在时,执行BiFunction函数的apply()方法
* 如果apply()返回值为null,则删除hashMap中的key节点,如果apply()返回值不为空,
* 用apply()执行结果的值替换key原有的value;
* 给定的key在hashMap中不存在时,直接返回null;
* */
@Override
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;//定义Node类型的节点e,V类型的对象oldValue
int hash = hash(key);//算出给定key的hash值
if ((e = getNode(hash, key)) != null &&
(oldValue = e.value) != null) { //如果用给定的key和hash在hashMap中找到相同的节点,
int mc = modCount;//定义变量mc=记录hashMap修改次数;
V v = remappingFunction.apply(key, oldValue);//执行自定义函数,函数执行结果为传入的 Lambda的执行结果,
//remappingFunction.apply()用法可参考我在computeIfAbsent方法中的mappingFunction注释
if (mc != modCount) { throw new ConcurrentModificationException(); } ///如果modCount不等于mc,说明有其它线程修改这个hashMap,抛出异常
if (v != null) { //说明自定义函数的执行结果不为空
e.value = v; //把e节点原有的value替换为自定义删除的执行结果
afterNodeAccess(e);//回调函数
return v;//返回新value
}
else //如果自定义删除执行结果为空,则删除key节点
removeNode(hash, key, null, false, true);
}
return null; //返回null
}