Kotlin 无法确定我已经检查过该项目是否在集合中

ibr*_*koz 0 null-check kotlin

val map = mapOf(
    'a' to 1,
    'b' to 2,
    'c' to 3
)

val c = 'a'
if (c in map) {
    println(map[c] + 1)
}
Run Code Online (Sandbox Code Playgroud)

在简单的代码存根中,Kotlin 编译器不允许我在println. 它向我大喊并发出以下警告:

Operator call corresponds to a dot-qualified call 'map[c].plus(1)' which is not allowed on a nullable receiver 'map[c]'.

这让我发疯,我不想让它!!安静下来。

Swe*_*per 7

就 Kotlin 而言,c in maptrue 和map[c]not null 之间没有任何关系。请注意,c in map是 的糖map.contains(c)map[c]是 的糖map.get(c)getcontains是两个独立的方法,根本不相关。

在极端情况下,谁能说在检查通过map后不能修改(例如由另一个线程) ,并且密钥现在已经消失了?inc

如果您想使用地图的值,则只需访问它而不检查c in map。执行 null 检查的方式与任何其他返回可为 null 值的方法相同。例如,您可以val首先将其分配给本地:

val value = map[c]
if (value != null) {
    println(value + 1)
}
Run Code Online (Sandbox Code Playgroud)

或者使用?.let

map[c]?.let { println(it + 1) }
Run Code Online (Sandbox Code Playgroud)

还有很多其他方法可以做到这一点,具体取决于您对值所做的具体操作,但这两种是我能想到的最通用的方法。