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)
的糖。get
和contains
是两个独立的方法,根本不相关。
在极端的情况下,谁说map
不能被修改(例如由另一个线程),在in
检查通过后,c
键现在已经消失了?
如果你想使用一个map的值,那么只需访问它,而不检查c in map
。执行空检查的方式与其他返回可空值的方法相同。例如,您可以先将其分配给本地val
:
val value = map[c]
if (value != null) {
println(value + 1)
}
或者使用?.let
:
map[c]?.let { println(it + 1) }
还有很多其他的方法可以做到这一点,这取决于你对值做了什么,但这两种是我能想到的最通用的方法。