map.getOrDefault().add() 在 Java 中不起作用
map.getOrDefault().add() in Java not works
传统代码运行良好,如下所示:
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
的默认值是 returned,但不会添加到映射中,因此您将添加 2
到数组列表中立即扔掉。
换句话说,这就是您的 getOrDefault
代码正在做的事情:
ArrayList<Integer> value;
if (!map.containsKey(1)) {
value = new ArrayList<>();
} else {
value = map.get(1);
}
value.add(2);
您应该改用 computeIfAbsent
。如果键不存在,此方法实际上将函数中的 return 值添加到映射中:
map.computeIfAbsent(1, x -> new ArrayList<>()).add(2);
或者你可以这样做:
if(!map.contansKey(1)) map.put(1, new ArrayList<>());
map.get(1).add(2);
所以你可以保存这些行 ;)
传统代码运行良好,如下所示:
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
的默认值是 returned,但不会添加到映射中,因此您将添加 2
到数组列表中立即扔掉。
换句话说,这就是您的 getOrDefault
代码正在做的事情:
ArrayList<Integer> value;
if (!map.containsKey(1)) {
value = new ArrayList<>();
} else {
value = map.get(1);
}
value.add(2);
您应该改用 computeIfAbsent
。如果键不存在,此方法实际上将函数中的 return 值添加到映射中:
map.computeIfAbsent(1, x -> new ArrayList<>()).add(2);
或者你可以这样做:
if(!map.contansKey(1)) map.put(1, new ArrayList<>());
map.get(1).add(2);
所以你可以保存这些行 ;)