我创建了以下方法,将给定的UUID值和给定的Integer添加到map
变量中。
final Map<Integer, List<UUID>> map = new TreeMap<>();
private void addToMap(Integer key, UUID value) {
map.computeIfAbsent(key, val -> new ArrayList<>()).add(value);
}
通常我试图通过将value
参数传递给lambda函数来使用map.computeIfAbsent(key, value -> new ArrayList<>()).add(value);
变量'value'已在作用域中定义"错误地指向";值";在CCD_ 4部分。
我更新的addToMap
方法是有效的,但我认为val
毫无意义。那么,这个方法应该如何更新呢?
您的addToMap()
方法意味着对computeIfAbsent()
方法的参数理解错误:
private void addToMap(Integer key, UUID value) {
map.computeIfAbsent(key, val -> new ArrayList<>()).add(value);
}
val -> new ArrayList<>()
中的参数与传递给addToMap()
的value
无关!
如果您查看JavaDoc for Map.comuteInfoAbsent(),您可以看到第二个参数是Function<? super K,? extends V>
,即一个获取键并返回应存储在映射中的任何内容的函数。
最好将addToMap()
方法写成
private void addToMap(Integer key, UUID value) {
map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
}
注意,来自toniedzwiez的答案是危险的。它只适用于密钥大于或等于零的Map<Integer, ?>
。
这是危险的,因为它基本上用k -> new ArrayList<>(k)
取代了k -> new ArrayList<>()
——这恰好适用于具有Integer
密钥的映射,并使用密钥值来定义ArrayList
的初始容量。
如果k
为负,它将不起作用(如果k为负,new ArrayList<>(k)
将抛出IllegalArgumentException
)。
它也不适用于Map<String, UUID>
,因为没有接受String
参数的ArrayList
构造函数。