【问题标题】:Incompatible parameter types in lambda expressionlambda 表达式中的参数类型不兼容
【发布时间】:2021-04-09 21:21:38
【问题描述】:
考虑这段代码:
Map<C1, C2> map;
C1 key;
C2 value;
为什么会这样:
map.computeIfAbsent(key, k -> value)
这不是吗?
map.computeIfAbsent(key, () -> value)
【问题讨论】:
标签:
java
dictionary
lambda
functional-programming
weak-references
【解决方案1】:
因为computeIfAbsent 方法具有以下签名:
default V computeIfAbsent(K key,
Function<? super K,? extends V> mappingFunction)
所以它需要一个Function,它是一个函数接口,它需要一个参数并返回一个值。而() -> value,不接收任何参数并产生一个值(例如,Supplier)。
【解决方案2】:
除了@dreamcrash's 答案之外,如果密钥不存在,还有一种方法提供到Map 的条目。
已添加到java-8,名为Map#putIfAbsent
这将完全按照您的想法工作
map.putIfAbsent("key", ((Supplier<String>) () -> "value").get());
但是这有点复杂,您更喜欢直接使用value
map.putIfAbsent("key", "value");