在Kotlin中,与这个表达式等价的是什么?
a ? b : c
这在Kotlin中是无效的代码。
在Kotlin中,与这个表达式等价的是什么?
a ? b : c
这在Kotlin中是无效的代码。
当前回答
其他答案中没有提到的一些极端情况。
自从Kotlin 1.1中出现takeIf后,三元运算符a ?B: c也可以这样表示:
b.takeIf { a } ?: c
在c为空的情况下,这将变得更短:
b.takeIf { a }
使b延迟求值的一般解决方法:
true.takeIf { a }?.let { b } ?: c
还要注意,在Java世界中,典型的空检查像value != null ?在Kotlin中转换为value ?: defaultValue。
类似a != null ?B: c可以翻译成a?让{b} ?: c。
看也是布尔?。如果真的建议在KT-6938应该允许简化一个?b: null表达式到a.f iftrue {b}而不提前计算b。
其他回答
Kotlin没有三元运算符。你可以使用正则if表达式,如下所示:
If (condition) exp1 else exp2
此外,在Kotlin中if不是语句而是表达式(即它计算为一个值),如果在if分支的主体中有多条语句(或else或else if的主体),块的最后一行就是该分支的值。例如:
if (a>b) {
println("a is greater than b")
a // value of this if
} else {
println("b is greater than a")
b // value of else
}
对于我自己,我使用以下扩展函数:
fun T?.or<T>(default: T): T = if (this == null) default else this
fun T?.or<T>(compute: () -> T): T = if (this == null) compute() else this
第一个函数将在object = null的情况下返回提供的默认值。第二个将在相同情况下计算lambda中提供的表达式。
用法:
1) e?.getMessage().or("unknown")
2) obj?.lastMessage?.timestamp.or { Date() }
就我个人而言,上面的代码比结构内联更具可读性
你可以这样做:
val ans = (exp1 == exp2) then "yes" ?: "no"
通过使用这个扩展:
infix fun<T> Boolean.then(first: T): T? = if (this) first else null
附注:先不要修改上面的中缀函数接受:T?,表达式就会变得逻辑错误。例:如果你先修改它接受空值:T?,那么val ans = (true == true)那么null ?: "abcd", ans将是"abcd",这将是不正确的。
这里的其他答案,例如takeIf假设x = (a != null) ?A: c或x = (A != null) ?a.method(): c,但这实际上并不等同于x = a ?B: c
实现一个真正等价的三元运算符与空安全检查(即x = (a != null) ?c)你可以用let代替takeIf。
Val x = a?让{b} ?: c
其中b可能是也可能不是调用a上某项内容的方法。
记住,与许多流行语言不同,三元运算符和猫王运算符在Kotlin中具有不同的含义。表情干什么?在Kotlin编译器中value1: value2会给你不好的单词,不像任何其他语言,因为在Kotlin中没有三元运算符,就像官方文档中提到的那样。原因是if、when和try-catch语句本身返回值。
那么,做表情?Value1: value2可以替换为
Val Max = if (a > b) print(选择一个) 其他的 打印(“选择b”)
Kotlin拥有的Elvis运算符只适用于可空变量的情况,例如:
如果我执行类似value3 = value1 ?: value2这样的操作,那么如果value1为null,那么将返回value2,否则将返回value1。
从这些回答中可以得到更清晰的理解。