lambda 表达式中不兼容的参数类型
Incompatible parameter types in lambda expression
考虑这段代码:
Map<C1, C2> map;
C1 key;
C2 value;
为什么这样做:
map.computeIfAbsent(key, k -> value)
这不是吗?
map.computeIfAbsent(key, () -> value)
因为方法 computeIfAbsent 具有以下签名:
default V computeIfAbsent(K key,
Function<? super K,? extends V> mappingFunction)
所以它需要一个 Function
,这是一个需要参数和 returns 值的函数接口。而 () -> value
不接收任何参数并生成一个值(例如、Supplier)。
除了@ 答案之外,如果密钥不存在,还有一种方法可以提供 Map
的条目。
已在java-8中添加,称为Map#putIfAbsent
这将完全按照您的想法工作
map.putIfAbsent("key", ((Supplier<String>) () -> "value").get());
但是这有点复杂,您更愿意直接使用 value
map.putIfAbsent("key", "value");
考虑这段代码:
Map<C1, C2> map;
C1 key;
C2 value;
为什么这样做:
map.computeIfAbsent(key, k -> value)
这不是吗?
map.computeIfAbsent(key, () -> value)
因为方法 computeIfAbsent 具有以下签名:
default V computeIfAbsent(K key,
Function<? super K,? extends V> mappingFunction)
所以它需要一个 Function
,这是一个需要参数和 returns 值的函数接口。而 () -> value
不接收任何参数并生成一个值(例如、Supplier)。
除了@Map
的条目。
已在java-8中添加,称为Map#putIfAbsent
这将完全按照您的想法工作
map.putIfAbsent("key", ((Supplier<String>) () -> "value").get());
但是这有点复杂,您更愿意直接使用 value
map.putIfAbsent("key", "value");