遇到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
1条答案
按热度按时间hc2pp10m1#
你放在
?:
右边的表达式是:这只是一个
() -> Unit
类型的lambda。计算这个表达式只会得到一个() -> Unit
类型的值。不执行块中的代码。如果你想执行lambda中的代码,你应该使用
run
:也就是说,如果你想根据键是否存在来打印不同的消息,像这样简单的东西更具可读性:
当然,如果不需要打印不同的消息,惯用的方法是
getOrPut
。