在Java中,map.getOrDefault().add()无法正常工作。

huangapple go评论83阅读模式
英文:

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&lt;Integer, List&lt;Integer&gt;&gt; map = new HashMap&lt;&gt;();
if (!map.containsKey(1)) {
   map.put(1, new ArrayList&lt;&gt;());
}
map.get(1).add(2);

Now I'd like to try the magic of getOrDefault:

map.getOrDefault(1, new ArrayList&lt;&gt;()).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&lt;Integer&gt; value;
if (!map.containsKey(1)) {
    value = new ArrayList&lt;&gt;();
} 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 -&gt; new ArrayList&lt;&gt;()).add(2);

答案2

得分: 1

或者你可以这样做:

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

这样你就可以节省这些行代码 在Java中,map.getOrDefault().add()无法正常工作。

英文:

or you could do:

if(!map.contansKey(1)) map.put(1, new ArrayList&lt;&gt;());
map.get(1).add(2);

so you can save those lines 在Java中,map.getOrDefault().add()无法正常工作。

huangapple
  • 本文由 发表于 2020年9月28日 11:04:16
  • 转载请务必保留本文链接:https://go.coder-hub.com/64095419.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定