map.getOrDefault().add() 在 Java 中不起作用

问题描述 投票:0回答: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)
为空。

为什么?

java hashmap
2个回答
16
投票

因为

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

1
投票

或者你可以这样做:

if(!map.containsKey(1)) map.put(1, new ArrayList<>());
map.get(1).add(2);

这样你就可以保存这些行;)

© www.soinside.com 2019 - 2024. All rights reserved.