Kotlin Ternary Conditional Operator

2019-01-06 10:01发布

What is the equivalent of this expression in Kotlin?

a ? b : c

This is not valid code in Kotlin.

27条回答
男人必须洒脱
2楼-- · 2019-01-06 10:15

There is no ternary operator in kotlin, as the if else block returns value

so, you can do: val max = if (a > b) a else b instead of java's max = (a > b) ? b : c

We can also use when construction, it also return value:

val max = when(a > b) {
    true -> a
    false -> b
}

Here is link for kotlin documentation : Control Flow: if, when, for, while

查看更多
我想做一个坏孩纸
3楼-- · 2019-01-06 10:15

There is no ternary operator in Kotlin. It seems problematic at the first glance. But think we can do it with inline if else statement because this is expression here. Simply we have to do -

var number = if(n>0) "Positive" else "Negetive"

Here we can else if block too as many as we need. Like-

var number = if(n>0) "Positive" else if(n<0) "Negative" else "Zero"

So this line is so simple and much readable than ternary operator. when we use more than one ternary operator in java it seems horrible. But here we have a clear syntax. even we can write it in multiple line too.

查看更多
来,给爷笑一个
4楼-- · 2019-01-06 10:15

Why would one use something like this:

when(a) {
  true -> b
  false -> b
}

when you can actually use something like this (a is boolean in this case):

when {
  a -> b
  else -> b
}
查看更多
戒情不戒烟
5楼-- · 2019-01-06 10:16

Java

int temp = a ? b : c;

Equivalent to Kotlin:

var temp = if (a) b else c
查看更多
Bombasti
6楼-- · 2019-01-06 10:17

Another short approach to use

val value : String = "Kotlin"

value ?: ""

Here kotlin itself checks null value and if it is null then it passes empty string value.

查看更多
疯言疯语
7楼-- · 2019-01-06 10:17

With the following infix functions I can cover many common use cases pretty much the same way it can be done in Python :

class TestKotlinTernaryConditionalOperator {

    @Test
    fun testAndOrInfixFunctions() {
        Assertions.assertThat(true and "yes" or "no").isEqualTo("yes")
        Assertions.assertThat(false and "yes" or "no").isEqualTo("no")

        Assertions.assertThat("A" and "yes" or "no").isEqualTo("yes")
        Assertions.assertThat("" and "yes" or "no").isEqualTo("no")

        Assertions.assertThat(1 and "yes" or "no").isEqualTo("yes")
        Assertions.assertThat(0 and "yes" or "no").isEqualTo("no")

        Assertions.assertThat(Date() and "yes" or "no").isEqualTo("yes")
        @Suppress("CAST_NEVER_SUCCEEDS")
        Assertions.assertThat(null as Date? and "yes" or "no").isEqualTo("no")
    }
}

infix fun <E> Boolean?.and(other: E?): E? = if (this == true) other else null
infix fun <E> CharSequence?.and(other: E?): E? = if (!(this ?: "").isEmpty()) other else null
infix fun <E> Number?.and(other: E?): E? = if (this?.toInt() ?: 0 != 0) other else null
infix fun <E> Any?.and(other: E?): E? = if (this != null) other else null
infix fun <E> E?.or(other: E?): E? = this ?: other
查看更多
登录 后发表回答