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 的条目。

已在中添加,称为Map#putIfAbsent

这将完全按照您的想法工作

map.putIfAbsent("key", ((Supplier<String>) () -> "value").get());

但是这有点复杂,您更愿意直接使用 value

map.putIfAbsent("key", "value");