jvm Kotlinelvis运算符不适用于map.get()

f87krz0w  于 2023-10-18  发布在  Kotlin
关注(0)|答案(1)|浏览(129)

遇到Kotlinelvis操作符的一些奇怪行为,当尝试从map中通过key获取一些值时,没有一个块不执行。

map["Key"]?.let {
    println("Run block, inserting into existing list")
    it.add("value")
} ?: {
    println("Elvis block, creating list with value")
    map["Key"] = mutableListOf("value")
}

我希望,如果Key存在,它会执行let块,打印行并将值插入现有列表。如果键不存在,它将进入elvis块,打印行,并插入新的列表值。但事实并非如此因为不是让块被执行,而不是猫王。
要解决我的任务,我使用:

map.getOrPut("Key") { mutableListOf() }.add("Value")

问题是,为什么我不能在这种情况下使用elvis和let运算符?
Kotlin版本1.8.22

hc2pp10m

hc2pp10m1#

你放在?:右边的表达式是:

{
    println("Elvis block, creating list with value")
    map["Key"] = mutableListOf("value")
}

这只是一个() -> Unit类型的lambda。计算这个表达式只会得到一个() -> Unit类型的值。不执行块中的代码。
如果你想执行lambda中的代码,你应该使用run

map["Key"]?.let {
    println("Run block, inserting into existing list")
    it.add("value")
} ?: run {
    println("Elvis block, creating list with value")
    map["Key"] = mutableListOf("value")
}

也就是说,如果你想根据键是否存在来打印不同的消息,像这样简单的东西更具可读性:

val list = map["Key"]
if (list != null) {
    println("Run block, inserting into existing list")
    list.add("value")
} else {
    println("Elvis block, creating list with value")
    map["Key"] = mutableListOf("value")
}

当然,如果不需要打印不同的消息,惯用的方法是getOrPut

相关问题