Kotlin三元条件运算符
Kotlin中这个表达的等价物是什么?
a ? b : c
这不是Kotlin中的有效代码。
在Kotlin中, if
语句是表达式。 所以下面的代码是等价的:
if (a) b else c
您可以定义自己的Boolean
扩展函数,当Boolean
值为false
时返回null
,以提供类似于三元运算符的结构:
infix fun <T> Boolean.then(param: T): T? = if (this) param else null
这会使a ? b : c
a ? b : c
表达式转换成a then b ?: c
,如下所示:
println(condition then "yes" ?: "no")
更新:但是要做更多的类似于Java的条件切换,你将需要类似的东西
infix fun <T> Boolean.then(param: () -> T): T? = if (this) param() else null
println(condition then { "yes" } ?: "no")
注意lambda。 其内容计算应该推迟到确定condition
true
为止
这个看起来很笨拙, 这就是为什么要把Java三元运算符转换成Kotlin的要求很高的原因
对于我自己,我使用以下扩展功能:
fun T?.or<T>(default: T): T = if (this == null) default else this fun T?.or<T>(compute: () -> T): T = if (this == null) compute() else this
如果对象等于null,第一个将返回提供的默认值。 其次将在同一个案中评估lambda中提供的表达式。
用法:
1) e?.getMessage().or("unknown") 2) obj?.lastMessage?.timestamp.or { Date() }
就我个人而言,代码的上面比构建内联更具有可读性
在Kotlin中,
if
是一个表达式,即它返回一个值。 因此没有三元运算符(condition ? then : else)
,因为普通的如果在这个角色中工作的很好。 手动来源从这里
// Traditional usage var max = a if (a < b) max = b // With else var max: Int if (a > b) { max = a } else { max = b } // As expression val max = if (a > b) a else b
请参阅: https : //kotlinlang.org/docs/reference/control-flow.html
在Kotlin中,如果是一个表达式,即它返回一个值。 因此, 没有三元运算符 (条件?然后:else), 因为普通如果在这个角色工作 。
其他答案中没有提到的一些角落案例。
自Kotlin 1.1出现以后 ,三元运算符a ? b : c
a ? b : c
也可以这样表示:
b.takeIf { a } ?: c
在c为null
情况下,这变得更短:
b.takeIf { a }
还要注意在Java世界中的典型空值检查value != null ? value : defaultValue
value != null ? value : defaultValue
在ideomatic Kotlin中翻译为value ?: defaultValue
。
类似a != null ? b : c
a != null ? b : c
可以翻译成a?.let { b } ?: c
。
kotlin中没有三进制运算符 ,因为if else
块返回值
所以,你可以这样做: val max = if (a > b) a else b
而不是java的max = (a > b) ? b : c
max = (a > b) ? b : c
我们也可以when
施工的when
使用,也可以返回值:
val max = when(a > b) { true -> a false -> b }
这里是文档链接https://kotlinlang.org/docs/reference/control-flow.html
Java的
int temp = a? b:c;
相当于Kotlin:
var temp = if(a)b else c
当替换C语言的开关操作符时。 最简单的形式是这样的
when (x) { 1 -> print("x == 1") 2 -> print("x == 2") else -> { print("x is neither 1 nor 2") } }
Kotlin没有三元操作符。 乍一看似乎有问题。 但是我们可以用inline if else语句来实现,因为这是表达式。 我们只需要做 –
var number = if(n>0) "Positive" else "Negetive"
如果我们需要的话,我们可以阻止太多的事情。 喜欢-
var number = if(n>0) "Positive" else if(n<0) "Negative" else "Zero"
所以这条线比三元运算符简单易读。 当我们在java中使用多个三元操作符时,它看起来很可怕。 但是这里我们有一个清晰的语法。 即使我们也可以把它写成多行。
正如Drew Noakes所引用的,kotlin使用if语句作为表达式,所以三元条件运算符不再是必要的,
但是用扩展函数和中缀超载,你可以自己实现,这里是一个例子
infix fun <T> Boolean.then(value: T?) = TernaryExpression(this, value) class TernaryExpression<out T>(val flag: Boolean, val truly: T?) { infix fun <T> or(falsy: T?) = if (flag) truly else falsy }
然后像这样使用它
val grade = 90 val clazz = (grade > 80) then "A" or "B"
另一个有趣的方法是使用when
:
when(a) { true -> b false -> b }
在一些更复杂的情况下可以非常方便。 说实话,这对我来说比if ... else ...
更可读if ... else ...
另一个短的方法来使用
val value : String = "Kotlin" value ?: ""
这里kotlin本身检查null值,如果它是null,则它传递空字符串值。
语句 – >表达式
在Kotlin中,许多陈述包括if
, when
,甚至try
都可以用作表达式 。 这意味着,它有一个结果,可以分配给一个变量,从一个函数返回等等。
不需要三元运算符
话虽如此, Kotlin并不需要三元运算符 。
if (a) b else c
是你可以使用的而不是Java表达式a ? b : c
a ? b : c
。
国际海事组织 ,后者是不太可读,因为每个人都知道什么ifelse
,而? :
? :
很不方便。 所以我同意三元运营商无权在Kotlin中存在。
其他选择
什么时候
在Kotlin中检查条件when
您可能会看到很多结构。 这也是以其他方式表达if-else级联的方式。 以下对应于你的例子。
when(a) { true -> b false -> b }
扩展
在其他答案中显示了很多很好的示例( https://stackoverflow.com/a/39687177/8073652 ),扩展也可以成为一种方法。
你可以在Kotlin做很多事情
-
使用if
如果(a)b else c
-
使用时
when (a) { true -> print("value b") false -> print("value c") else -> {
print("default return in any other case") } } -
零安全
val a = b ?: c