Kotlin三元条件运算符

Kotlin中这个表达的等价物是什么?

a ? b : c 

这不是Kotlin中的有效代码。

在Kotlin中, if语句是表达式。 所以下面的代码是等价的:

 if (a) b else c 

您可以定义自己的Boolean扩展函数,当Boolean值为false时返回null ,以提供类似于三元运算符的结构:

 infix fun <T> Boolean.then(param: T): T? = if (this) param else null 

这会使a ? b : c a ? b : c表达式转换成a then b ?: c ,如下所示:

 println(condition then "yes" ?: "no") 

更新:但是要做更多的类似于Java的条件切换,你将需要类似的东西

infix fun <T> Boolean.then(param: () -> T): T? = if (this) param() else null

println(condition then { "yes" } ?: "no")注意lambda。 其内容计算应该推迟到确定condition true为止

这个看起来很笨拙, 这就是为什么要把Java三元运算符转换成Kotlin的要求很高的原因

对于我自己,我使用以下扩展功能:

 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 

如果对象等于null,第一个将返回提供的默认值。 其次将在同一个案中评估lambda中提供的表达式。

用法:

 1) e?.getMessage().or("unknown") 2) obj?.lastMessage?.timestamp.or { Date() } 

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

在Kotlin中, if是一个表达式,即它返回一个值。 因此没有三元运算符(condition ? then : else) ,因为普通的如果在这个角色中工作的很好。 手动来源从这里

 // Traditional usage var max = a if (a < b) max = b // With else var max: Int if (a > b) { max = a } else { max = b } // As expression val max = if (a > b) a else b 

请参阅: https : //kotlinlang.org/docs/reference/control-flow.html

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

其他答案中没有提到的一些角落案例。

自Kotlin 1.1出现以后 ,三元运算符a ? b : c a ? b : c也可以这样表示:

 b.takeIf { a } ?: c 

在c为null情况下,这变得更短:

 b.takeIf { a } 

还要注意在Java世界中的典型空值检查value != null ? value : defaultValue value != null ? value : defaultValue在ideomatic Kotlin中翻译为value ?: defaultValue

类似a != null ? b : c a != null ? b : c可以翻译成a?.let { b } ?: c

kotlin中没有三进制运算符 ,因为if else块返回值

所以,你可以这样做: val max = if (a > b) a else b而不是java的max = (a > b) ? b : c max = (a > b) ? b : c

我们也可以when施工的when使用,也可以返回值:

val max = when(a > b) { true -> a false -> b }

这里是文档链接https://kotlinlang.org/docs/reference/control-flow.html

Java的

int temp = a? b:c;

相当于Kotlin:

var temp = if(a)b else c

当替换C语言的开关操作符时。 最简单的形式是这样的

 when (x) { 1 -> print("x == 1") 2 -> print("x == 2") else -> { print("x is neither 1 nor 2") } } 

Kotlin没有三元操作符。 乍一看似乎有问题。 但是我们可以用inline if else语句来实现,因为这是表达式。 我们只需要做 –

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

如果我们需要的话,我们可以阻止太多的事情。 喜欢-

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

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

正如Drew Noakes所引用的,kotlin使用if语句作为表达式,所以三元条件运算符不再是必要的,

但是用扩展函数和中缀超载,你可以自己实现,这里是一个例子

 infix fun <T> Boolean.then(value: T?) = TernaryExpression(this, value) class TernaryExpression<out T>(val flag: Boolean, val truly: T?) { infix fun <T> or(falsy: T?) = if (flag) truly else falsy } 

然后像这样使用它

 val grade = 90 val clazz = (grade > 80) then "A" or "B" 

另一个有趣的方法是使用when

 when(a) { true -> b false -> b } 

在一些更复杂的情况下可以非常方便。 说实话,这对我来说比if ... else ...更可读if ... else ...

另一个短的方法来使用

 val value : String = "Kotlin" value ?: "" 

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

语句 – >表达式

在Kotlin中,许多陈述包括ifwhen ,甚至try都可以用作表达式 。 这意味着,它有一个结果,可以分配给一个变量,从一个函数返回等等。

不需要三元运算符

话虽如此, Kotlin并不需要三元运算符

if (a) b else c是你可以使用的而不是Java表达式a ? b : c a ? b : c

国际海事组织 ,后者是不太可读,因为每个人都知道什么ifelse ,而? : ? :很不方便。 所以我同意三元运营商无权在Kotlin中存在。

其他选择

什么时候

在Kotlin中检查条件when您可能会看到很多结构。 这也是以其他方式表达if-else级联的方式。 以下对应于你的例子。

 when(a) { true -> b false -> b } 

扩展

在其他答案中显示了很多很好的示例( https://stackoverflow.com/a/39687177/8073652 ),扩展也可以成为一种方法。

你可以在Kotlin做很多事情

  1. 使用if

    如果(a)b else c

  2. 使用时

    when (a) { true -> print("value b") false -> print("value c") else -> {
    print("default return in any other case") } }

  3. 零安全

    val a = b ?: c

Interesting Posts