在Kotlin中,这个表达式的等价物是什么?
a ? b : c
这不是Kotlin中的有效代码。
发布于 2013-05-02 19:08:15
在Kotlin中,if
语句是表达式。因此,以下代码是等效的:
if (a) b else c
表达式和语句之间的区别在这里很重要。在Java/C#/JavaScript中,if
形成一个语句,这意味着它不会解析为一个值。更具体地说,您不能将其赋值给变量。
// Valid Kotlin, but invalid Java/C#/JavaScript
var v = if (a) b else c
如果您来自一种使用if
作为语句的语言,这可能看起来不自然,但这种感觉很快就会平息下来。
发布于 2015-07-08 23:41:40
对于我自己,我使用以下扩展函数:
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的情况下返回所提供的默认值。Second将在相同的情况下计算lambda中提供的表达式。
用法:
1) e?.getMessage().or("unknown")
2) obj?.lastMessage?.timestamp.or { Date() }
就我个人而言,上面的代码比if
构造内联更具可读性
发布于 2017-06-11 20:30:07
一些在其他答案中没有提到的角落案例。
由于takeIf出现在Kotlin 1.1中,因此三元运算符a ? b : c
也可以表示为:
b.takeIf { a } ?: c
如果c为null
,则会变得更短。
b.takeIf { a }
还要注意,在Java语言世界中,通常情况下,像value != null ? value : defaultValue
这样的null检查只会将in Kotlin中的null转换为value ?: defaultValue
。
可以将类似的a != null ? b : c
转换为a?.let { b } ?: c
。
https://stackoverflow.com/questions/16336500
复制相似问题