传统代码运行良好,如下所示:
Map<Integer, List<Integer>> map = new HashMap<>();
if (!map.containsKey(1)) {
map.put(1, new ArrayList<>());
}
map.get(1).add(2);
Run Code Online (Sandbox Code Playgroud)
现在我想尝试一下 getOrDefault 的神奇之处:
map.getOrDefault(1, new ArrayList<>()).add(2);
Run Code Online (Sandbox Code Playgroud)
但是如果我使用上面的行,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);
Run Code Online (Sandbox Code Playgroud)
你应该computeIfAbsent改用。如果键不存在,此方法实际上会将函数的返回值添加到映射中:
map.computeIfAbsent(1, x -> new ArrayList<>()).add(2);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
604 次 |
| 最近记录: |