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