Java HashMap的computeIfAbsent函数

map.computeIfAbsent(K key, Function lambda)
is used to compute value for a given key using the given mapping function, if key is not already associated with a value (or is mapped to null) and enter that computed value in Hashmap else null.
用于利用给定的键值来计算得到value的情况 计算公式就是那个function.如果这个key之前不存在 那么就把这个键值直接放进去。
如果key存在的话,如果此key对应的值是null(记得hashtable和hashmap的区别?就是hashmap允许key和value都为Null),我们也要把这个计算的值更新过去。如果key对应的值不是Null 就不做任何更新(这也是为什么叫:computeIfAbsent的原因)

Returns: This method returns current (existing or computed) value associated with the specified key, or null if mapping returns null.
这个函数的返回值:返回当前这个key对应的值(不管是否重新compute,就是说 要么返回原值 要么返回计算过的值 返回null也是可以的)。

这个函数存在的意义是
我们不用检查这个键是否存在就能直接往里面放一些复杂的东西。
因为之前 我们想往一个map里面放键值对 我们用put(k, v),
如果我们想更新一个键的值,如果没有 我们就初始化,我们顶多可以用map.getOrDefault(key, 0) + 1;//但是这个用法很局限
但是如果我们想放一些更加复杂的东西 就需要用到computeIfAbsent().

// java8之前。从map中根据key获取value操作可能会有下面的操作
Object key = map.get("key");
if (key == null) {
    key = new Object();
    map.put("key", key);
}

// java8之后。上面的操作可以简化为一行,若key对应的value为空,会将第二个参数的返回值存入并返回
Object key2 = map.computeIfAbsent("key", k -> new Object());

实例:
看下面的那一长串和那两行:

for (int i = 0; i < m; i++) {
            int root = find(uf, i);
            map.computeIfAbsent(root, new ArrayList<>()).add(i); //注意因为这个函数是返回键所对应的值的 因此我们可以直接add,非常方便
            // if (!map.containsKey(i)) {
            //         map.put(i, new ArrayList<>());
            //         map.get(i).add(uf[i]);
            //     } else {
            //         map.get(i).add(i);
            //     }
        }
posted @ 2020-12-01 11:04  EvanMeetTheWorld  阅读(184)  评论(0)    收藏  举报