在Kotlin中,与这个表达式等价的是什么?
a ? b : c
这在Kotlin中是无效的代码。
在Kotlin中,与这个表达式等价的是什么?
a ? b : c
这在Kotlin中是无效的代码。
当前回答
在Java中,if是语句,但在Kotlin中if是表达式。它被称为表达式,因为它比较a和b的值并返回最大值。因此,在Kotlin中没有三元运算符(a>b)?A:b,因为它被if表达式所取代。
其他回答
您可以定义自己的布尔扩展函数,当布尔值为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中使用if表达式。在Kotlin中if是一个带有结果值的表达式。所以在Kotlin中,我们可以写
fun max(a: Int, b: Int) = if (a > b) a else b
在Java中,我们可以用更大的代码实现同样的效果
int max(int a, int b) {
return a > b ? a : b
}
Java中等价的三元运算符
a ? b : c
是一个简单的IF在Kotlin一行
if(a) b else c
没有三元操作符(条件?然后:else),因为 普通的如果在这个角色中表现得很好。
https://kotlinlang.org/docs/reference/control-flow.html#if-expression
Null比较的特殊情况
你可以使用Elvis运算符
if ( a != null ) a else b
// equivalent to
a ?: b
如果你不知道如何使用标准符号,你也可以使用类似这样的中缀来创建/模拟它:
创建一个类来保存目标和结果:
data class Ternary<T>(val target: T, val result: Boolean)
创建一些中缀函数来模拟三元操作
infix fun <T> Boolean.then(target: T): Ternary<T> {
return Ternary(target, this)
}
infix fun <T> Ternary<T>.or(target: T): T {
return if (this.result) this.target else target
}
然后你就可以这样使用它了:
val collection: List<Int> = mutableListOf(1, 2, 3, 4)
var exampleOne = collection.isEmpty() then "yes" or "no"
var exampleTwo = (collection.isNotEmpty() && collection.contains(2)) then "yes" or "no"
var exampleThree = collection.contains(1) then "yes" or "no"
在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在选择如何表达代码方面提供了很大的灵活性。我的例子有无数的变化,可能我还没有发现的方法。我希望这能有所帮助!