HashMap (jdk1.8)computeIfPresent()方法注释

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
    }

上一篇:python进程池multiprocessing.pool


下一篇:Python函数中apply、map、applymap的区别