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

a ? b : c

这在Kotlin中是无效的代码。


当前回答

例如:var energy: Int = data?.get(position)?.energy?.toInt() ?: 0

在kotlin中,如果你使用?:,它会像这样工作,如果语句将返回null,那么?:0,它将取0或任何你写在这一边的东西。

其他回答

在Kotlin中,你可以像这样使用三元运算:"add b" else "add c"

您可以在Kotlin中以多种方式实现它

如果使用 如果(a) b else c 使用时 当(a) { True ->打印("value b") 错误->打印("value c") Else -> { 打印("在任何其他情况下默认返回") } } 空安全 Val a = b ?: c

记住,与许多流行语言不同,三元运算符和猫王运算符在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。

从这些回答中可以得到更清晰的理解。

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

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

这是a ?B: c表达式翻译成a然后B ?: c,像这样:

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

更新: 但是要做一些更类似于java的条件切换,您将需要类似的东西

infix fun <T>布尔值。then(参数:()-> T): T?= if (this) param() else null

Println(条件然后{"yes"} ?: "no") 注意这个。它的内容计算应该推迟,直到我们确定条件为真

这个看起来很笨拙,这就是为什么有很高的要求存在的Java三元运算符移植到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在选择如何表达代码方面提供了很大的灵活性。我的例子有无数的变化,可能我还没有发现的方法。我希望这能有所帮助!