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)
的糖。 get
和 contains
是两个不同的方法,完全没有关系。
在极端情况下,谁说map
在in
检查通过后不能修改(例如通过另一个线程),而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) }
还有很多其他方法可以做到这一点,具体取决于您对值的具体处理方式,但这两种是我能想到的最通用的方法。
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
钥匙现在不见了?
如果您想使用地图的值,则无需检查即可访问它 c in map
。执行 null 检查的方式与对 returns 可为 null 值的任何其他方法相同。例如,您可以先将其分配给本地 val
:
val value = map[c]
if (value != null) {
println(value + 1)
}
或使用?.let
:
map[c]?.let { println(it + 1) }
还有很多其他方法可以做到这一点,具体取决于您对值的具体处理方式,但这两种是我能想到的最通用的方法。