英文:
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)
会是空值。
为什么呢?
英文:
The traditional code works well like below:
Map<Integer, List<Integer>> map = new HashMap<>();
if (!map.containsKey(1)) {
map.put(1, new ArrayList<>());
}
map.get(1).add(2);
Now I'd like to try the magic of getOrDefault:
map.getOrDefault(1, new ArrayList<>()).add(2);
But if I use the above line, then map.get(1)
is null.
Why?
答案1
得分: 12
因为getOrDefault
,正如其名称所示,只从地图中获取内容。它不会向地图中添加新的键值对。当键不存在时,您传递给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);
英文:
Because getOrDefault
, as its name suggests, only gets stuff from the map. It doesn't adds a new KVP to the map. When the key is not present, the default value you pass to getOrDefault
is returned, but not added to the map, so you'd be adding 2
to an array list that is thrown away immediately.
In other words, this is what your getOrDefault
code is doing:
ArrayList<Integer> value;
if (!map.containsKey(1)) {
value = new ArrayList<>();
} else {
value = map.get(1);
}
value.add(2);
You should use computeIfAbsent
instead. This method actually adds the return value from the function to the map if the key is not present:
map.computeIfAbsent(1, x -> new ArrayList<>()).add(2);
答案2
得分: 1
或者你可以这样做:
if (!map.containsKey(1)) {
map.put(1, new ArrayList<>());
}
map.get(1).add(2);
这样你就可以节省这些行代码
英文:
or you could do:
if(!map.contansKey(1)) map.put(1, new ArrayList<>());
map.get(1).add(2);
so you can save those lines
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论