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);
// }
}

浙公网安备 33010602011771号