Kotlin中的三元运算符

时间:2018-08-10 05:09:46

标签: android kotlin

我可以用Java编写

int i = 10;
String s = i==10 ? "Ten" : "Empty";

即使我可以在方法参数中传递它。

callSomeMethod(i==10 ? "Ten" : "Empty");

如何将其转换为kotlin?在Kotlin中编写相同内容时,Lint显示错误。

4 个答案:

答案 0 :(得分:5)

callSomeMethod( if (i==10) "Ten" else "Empty")

关于三元运算符的讨论: https://discuss.kotlinlang.org/t/ternary-operator/2116/3

答案 1 :(得分:1)

您可以为布尔值创建通用的扩展功能

 fun <T> Boolean.elvis( a :T, b :T ): T{
     if(this) // this here refers to the boolean result
         return a
     else
         return b
}

现在您可以将其用于任何布尔值(酷Kotlin)

//                                         output
System.out.print((9>6).elvis("foo","bar")) foo
System.out.print((5>6).elvis("foo","bar")) bar

Extensions in kotlin

答案 2 :(得分:1)

由于最初的问题是使用“猫王运算符”一词,所以最好与三元运算符进行简短的比较。

三元运算符和Elvis运算符之间的主要区别在于,三元运算符用于简短的if / else替换,而Elvis运算符用于零安全,例如:

  • port = (config.port != null) ? config.port : 80;-if / then / else语句的快捷方式
  • port = config.port ?: 80-提供一个默认值,以防原始值为null

这些示例看起来非常相似,但是三元运算符可以与任何类型的布尔检查一起使用,而猫王运算符是use config.port if it's not null else use 80的简写,因此它仅检查null

现在,我认为Kotlin没有三元运算符,您应该像这样使用if语句-s = if (i==10) "Ten" else "Empty"

答案 3 :(得分:0)

代替

String s = i==10 ? "Ten" : "Empty";

从技术上讲您可以做到

val s = if(i == 10) "Ten" else "Empty"

val s = when {
    i == 10 -> "Ten"
    else -> "Empty"
}

val s = i.takeIf { it == 10 }?.let { "Ten" } ?: "Empty"

// not really recommended, just writing code at this point
val s = choose("Ten", "Empty") { i == 10 } 
inline fun <T> choose(valueIfTrue: T, valueIfFalse: T, predicate: () -> Boolean) = 
    if(predicate()) valueIfTrue else valueIfFalse