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

a ? b : c

这在Kotlin中是无效的代码。


当前回答

在Kotlin中没有三元操作,但是有一些有趣的方法可以解决这个问题。正如其他人指出的那样,直接翻译成Kotlin应该是这样的:

val x = if (condition) result1 else result2

但就我个人而言,我认为这可能会有点混乱,很难阅读。库中还内置了一些其他选项。你可以将takeIf{}与elvis操作符一起使用:

val x = result1.takeIf { condition } ?: result2

这里发生的事情是takeIf{}命令返回result1或null,而elvis操作符处理null选项。还有一些额外的选项,例如takeUnless {}:

val x = result1.takeUnless { condition } ?: result2

语言很清楚,你知道它在做什么。

如果这是一个常用的条件,您还可以做一些有趣的事情,比如使用内联扩展方法。让我们假设我们想要追踪一个Int类型的游戏分数,并且我们想要在给定条件不满足时总是返回0:

inline fun Int.zeroIfFalse(func: () -> Boolean) : Int = if (!func.invoke()) 0 else this     

好吧,这看起来很难看。但是考虑一下它在使用时的样子:

var score = 0
val twoPointer = 2
val threePointer = 3

score += twoPointer.zeroIfFalse { scoreCondition } 
score += threePointer.zeroIfFalse { scoreCondition } 

如您所见,Kotlin在选择如何表达代码方面提供了很大的灵活性。我的例子有无数的变化,可能我还没有发现的方法。我希望这能有所帮助!

其他回答

博士TL;

if (a) b else c

^是你可以用来代替三元运算符表达式a ?b: c,这是Kotlin语法不允许的。


在Kotlin中,许多控制语句,例如if、when,甚至try,都可以用作表达式。因此,这些语句的结果可以赋值给变量,也可以从函数返回,等等。

从语法上讲,不需要三元运算符

由于使用了Kotlin的表达式,该语言实际上并不需要三元运算符。

if (a) b else c

你可以用什么来代替三元运算符表达式a ?B: c。

我认为前一种表达更有可读性,因为每个人都知道如果其他人做了什么,然而?:如果您不熟悉语法,则不太清楚。

然而,我不得不承认,我经常错过更方便的三元运算符。


其他备选方案

when

您还可以看到在检查条件时Kotlin中使用的构造。这也是一种以另一种方式表达if-else级联的方法。下面以OTs为例。

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

扩展

正如其他答案中的许多好例子(Kotlin三元条件运算符)所示,扩展还可以帮助解决您的用例。

在Kotlin中没有三元操作,但是有一些有趣的方法可以解决这个问题。正如其他人指出的那样,直接翻译成Kotlin应该是这样的:

val x = if (condition) result1 else result2

但就我个人而言,我认为这可能会有点混乱,很难阅读。库中还内置了一些其他选项。你可以将takeIf{}与elvis操作符一起使用:

val x = result1.takeIf { condition } ?: result2

这里发生的事情是takeIf{}命令返回result1或null,而elvis操作符处理null选项。还有一些额外的选项,例如takeUnless {}:

val x = result1.takeUnless { condition } ?: result2

语言很清楚,你知道它在做什么。

如果这是一个常用的条件,您还可以做一些有趣的事情,比如使用内联扩展方法。让我们假设我们想要追踪一个Int类型的游戏分数,并且我们想要在给定条件不满足时总是返回0:

inline fun Int.zeroIfFalse(func: () -> Boolean) : Int = if (!func.invoke()) 0 else this     

好吧,这看起来很难看。但是考虑一下它在使用时的样子:

var score = 0
val twoPointer = 2
val threePointer = 3

score += twoPointer.zeroIfFalse { scoreCondition } 
score += threePointer.zeroIfFalse { scoreCondition } 

如您所见,Kotlin在选择如何表达代码方面提供了很大的灵活性。我的例子有无数的变化,可能我还没有发现的方法。我希望这能有所帮助!

这里的其他答案,例如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没有三元运算符。你可以使用正则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
}

看看这些文件:

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