在Kotlin中,与这个表达式等价的是什么?

a ? b : c

这在Kotlin中是无效的代码。


当前回答

其他答案中没有提到的一些极端情况。

自从Kotlin 1.1中出现takeIf后,三元运算符a ?B: c也可以这样表示:

b.takeIf { a } ?: c

在c为空的情况下,这将变得更短:

b.takeIf { a }

使b延迟求值的一般解决方法:

true.takeIf { a }?.let { b } ?: c

还要注意,在Java世界中,典型的空检查像value != null ?在Kotlin中转换为value ?: defaultValue。

类似a != null ?B: c可以翻译成a?让{b} ?: c。


看也是布尔?。如果真的建议在KT-6938应该允许简化一个?b: null表达式到a.f iftrue {b}而不提前计算b。

其他回答

在Kotlin中没有三元运算符,最封闭的是下面两种情况,

If else作为表达式语句

val a = true if(a) print(" a是真")else print(" a是假")

猫王运营商

如果?:左边的表达式不为空,则猫王操作符 返回它,否则返回右边的表达式。请注意 右边的表达式只在左边的表达式被求值 Side为空。

 val name = node.getName() ?: throw IllegalArgumentException("name expected")

参考文档

另一种简单的方法

val value : String = "Kotlin"

value ?: ""

这里kotlin本身检查空值,如果它为空,则传递空字符串值。

在Kotlin中,if语句是表达式。所以下面的代码是等价的:

if (a) b else c

表达式和语句之间的区别在这里很重要。在Java/ c# /JavaScript中,if形成语句,意味着它不解析为值。更具体地说,你不能把它赋值给一个变量。

// Valid Kotlin, but invalid Java/C#/JavaScript
var v = if (a) b else c

如果你来自一种If是语句的语言,这可能看起来不自然,但这种感觉很快就会消失。

你可以使用var a= if (a) b else c来代替三元运算符。

kotlin的另一个好概念是Elvis运算符。你不需要每次都检查null。

val l = b?.length ?: -1

如果b不为空,则返回length,否则执行右边语句。

使用以下中缀函数,我可以覆盖许多常见的用例,几乎与在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