Kotlin中Map.computeIfAbsent返回null编译报错是BUG吗?
问题原因
这不是Kotlin的BUG,属于使用方式不符合Kotlin标准库的API设计规则。
Kotlin的MutableMap接口的computeIfAbsent方法和Java的同名方法设计存在差异:
- Java的
Map.computeIfAbsent允许映射函数返回null,返回null时不会把对应键值对存入Map,方法整体返回null - Kotlin标准库对
computeIfAbsent的签名做了空安全适配,要求映射函数返回的类型必须和Map的值类型严格匹配,不允许返回和值类型不匹配的可空结果,方法的签名定义如下:
fun <K, V> MutableMap<K, V>.computeIfAbsent( key: K, defaultValue: (key: K) -> V ): V
你定义的Map值类型为不可空String,但calcValue返回的是可空String?,自然不符合类型要求,所以触发编译错误。
解决方案
根据你的业务场景可以选择以下任意一种方案:
- 如果你能确保对应场景下
calcValue不会返回null,可以添加非空断言适配类型
map.computeIfAbsent(key) { calcValue(it)!! }
- 如果你确实需要在Map中存储null值,修改Map的泛型声明,把值类型改为可空
val map = mutableMapOf<String, String?>()
- 如果你不需要把null存入Map,
calcValue返回null时跳过写入操作,可以用原生的判断逻辑替代computeIfAbsent
if (key !in map) { calcValue(key)?.let { map[key] = it } }
内容的提问来源于stack exchange,提问作者Nolequen
相关产品推荐
相关产品推荐

