在Kotlin中,与这个表达式等价的是什么?
a ? b : c
这在Kotlin中是无效的代码。
在Kotlin中,与这个表达式等价的是什么?
a ? b : c
这在Kotlin中是无效的代码。
当前回答
例如:var energy: Int = data?.get(position)?.energy?.toInt() ?: 0
在kotlin中,如果你使用?:,它会像这样工作,如果语句将返回null,那么?:0,它将取0或任何你写在这一边的东西。
其他回答
你可以使用var a= if (a) b else c来代替三元运算符。
kotlin的另一个好概念是Elvis运算符。你不需要每次都检查null。
val l = b?.length ?: -1
如果b不为空,则返回length,否则执行右边语句。
在Kotlin中,你可以像这样使用三元运算:"add b" else "add c"
如果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()
}
您可以定义自己的布尔扩展函数,当布尔值为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
Java
int temp = a ? b : c;
相当于Kotlin:
var temp = if (a) b else c