Java流中奇怪的lambda行为



我创建了以下方法,将给定的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构造函数。

相关内容

  • 没有找到相关文章