在 Kotlin 中,Elvis 操作符特定是跟 null 进行比较。也就是说
1 | val y = x ?: 0 // 使用 Elvis 操作符 ?: |
等价于
1 | val y = if (x !== null) x else 0 // 等价的 if...else 逻辑 |
主要用来做 null
安全性检查。
Elvis 操作符 ?:
是一个二元运算符,如果第一个操作数为真,则返回第一个操作数,否则将计算并返回其第二个操作数。它是三元条件运算符的变体,Kotlin 中没有类似 true? 1 : 0
这样的三元运算符,取而代之的是 if(true) 1 else 0
。而 Elvis 操作符算是精简版的三元运算符。
注意:这里所说的 Elvis 操作符是精简版的三元运算符是一种狭义的概念,因为 Elvis 操作符仅限于跟 null 进行比较,是广义三元运算符中的一个特例。
我们在 Java 中使用的三元运算符的语法通常要重复变量两次,示例如下:
1 | String name = "Elvis Presley"; |
可以使用 Elvis 操作符取而代之:
1 | val name: String = "Elvis Presley" |
可以看出,用 Elvis 操作符 ?:
可以把带有默认值的 if...else
结构写的极其简短。用 Elvis 操作符不用检查 null
(避免空指针),也不用重复变量。
Elvis 操作符的这个功能在 Spring 表达式语言(SpEL)中有提供,在 Kotlin 中当然没有理由不支持这个特性。代码示例如下:
1 | val x = null |
1 | val x = false |
1 | val x = "" |
1 | val x = "ABC" |