Java 流中的奇怪 lambda 行为

Strange lambda behaviour in Java stream

我创建了以下方法,将给定的 UUID 值和给定的整数添加到 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' 已在范围中定义”错误指向 .. value -> ... 部分中的“值”。

我更新的 addToMap 方法有效,但我认为 val 毫无意义。那么,这个方法应该如何更新呢?

你的addToMap()方法暗示了对[=​​13=]方法参数的错误理解:

private void addToMap(Integer key, UUID value) {
    map.computeIfAbsent(key, val -> new ArrayList<>()).add(value);
}

val -> new ArrayList<>()里面的参数和你传给addToMap()value没有任何关系!

如果你查看 Map.computeIfAbsent() 的 JavaDoc,你可以看到第二个参数是 Function<? super K,​? extends V> - 即一个函数,它接受一个键和 returns 任何应该存储在地图。

addToMap()方法最好写成

private void addToMap(Integer key, UUID value) {
    map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
}

请注意,toniedzwiedz 的回答很危险。它仅适用于键大于或等于零的 Map<Integer, ?>

这很危险,因为它基本上用 k -> new ArrayList<>(k) 替换了 k -> new ArrayList<>() - 这恰好适用于具有 Integer 键的地图,并使用键值来定义 [= 的初始容量=23=].

如果 k 为负数,它将不起作用(如果 k 为负数,new ArrayList<>(k) 将抛出一个 IllegalArgumentException)。

它也不适用于 Map<String, UUID>,因为没有 ArrayList 构造函数接受 String 参数。