在Kotlin中,与这个表达式等价的是什么?

a ? b : c

这在Kotlin中是无效的代码。


当前回答

另一种简单的方法

val value : String = "Kotlin"

value ?: ""

这里kotlin本身检查空值,如果它为空,则传递空字符串值。

其他回答

在Java中,if是语句,但在Kotlin中if是表达式。它被称为表达式,因为它比较a和b的值并返回最大值。因此,在Kotlin中没有三元运算符(a>b)?A:b,因为它被if表达式所取代。

看看这些文件:

在Kotlin中,if是一个表达式,即它返回一个值。因此, 没有三元运算符(条件?然后:else), 因为普通的if在这个角色中很管用。

如果condition为false则为" error ",否则为"someString"

在编写三元条件运算符之前,让我们考虑以下原型:

if (!answer.isSuccessful()) {
    result = "wrong"
} else {
    result = answer.body().string()
}

return result

解决方案

你可以用!(逻辑上不是)Kotlin if-expression中的运算符:

return if (!answer.isSuccessful()) "wrong" else answer.body().string()

如果你使用if-expression (expression without !操作符):

return if (answer.isSuccessful()) answer.body().string() else "wrong"

Kotlin 's Elvis operator ?:可以做得更好:

return answer.body()?.string() ?: "wrong"

同样,为相应的Answer类使用扩展函数:

fun Answer.bodyOrNull(): Body? = if (isSuccessful()) body() else null

在扩展函数中,由于Elvis操作符,您可以减少代码:

return answer.bodyOrNull()?.string() ?: "wrong"

或者直接用when条件表达式:

when (!answer.isSuccessful()) {
    parseInt(str) -> result = "wrong"
    else -> result = answer.body().string()
}

对于我自己,我使用以下扩展函数:

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() }

就我个人而言,上面的代码比结构内联更具可读性

在Kotlin中没有三元运算符。乍一看,这似乎有问题。但是我们可以用内联if else语句因为这是表达式。我们要做的就是

var number = if(n>0) "Positive" else "Negetive"

这里我们可以用else if来阻塞我们需要的太多。像- - - - - -

var number = if(n>0) "Positive" else if(n<0) "Negative" else "Zero"

这一行比三元运算符简单易读。当我们在Java中使用多个三元运算符时,这看起来很可怕。但是这里我们有一个清晰的语法。甚至我们也可以把它写成多行。