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

Kotlin cannot make out that I've already checked whether the item is in the collection

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

val c = 'a'
if (c in map) {
    println(map[c] + 1)
}

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

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

这让我很生气,我不想让 !! 让它安静下来。

就 Kotlin 而言,c in map 为真与 map[c] 不为空之间没有关系。请注意,c in map 只是 map.contains(c) 的糖,而 map[c] 只是 map.get(c) 的糖。 getcontains 是两个不同的方法,完全没有关系。

在极端情况下,谁说mapin检查通过后不能修改(例如通过另一个线程),而c 钥匙现在不见了?

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

val value = map[c]
if (value != null) {
    println(value + 1)
}

或使用?.let:

map[c]?.let { println(it + 1) }

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