传统代码运行良好,如下所示:
Map<Integer, List<Integer>> map = new HashMap<>();
if (!map.containsKey(1)) {
map.put(1, new ArrayList<>());
}
map.get(1).add(2);
现在我想尝试 getOrDefault 的魔力:
map.getOrDefault(1, new ArrayList<>()).add(2);
但是如果我使用上面的行,那么
map.get(1)
为空。
为什么?
因为
getOrDefault
,顾名思义,只能从地图中获取东西。它不会向地图添加新的 KVP。当键不存在时,将返回传递给 getOrDefault
的默认值,但不会添加到映射中,因此您会将 2
添加到立即丢弃的数组列表中。
换句话说,这就是您的
getOrDefault
代码正在做的事情:
ArrayList<Integer> value;
if (!map.containsKey(1)) {
value = new ArrayList<>();
} else {
value = map.get(1);
}
value.add(2);
computeIfAbsent
来代替。如果键不存在,此方法实际上会将函数的返回值添加到映射中:
map.computeIfAbsent(1, x -> new ArrayList<>()).add(2);
或者你可以这样做:
if(!map.containsKey(1)) map.put(1, new ArrayList<>());
map.get(1).add(2);
这样你就可以保存这些行;)