Elvis运算是一个小技巧,其实就是if else 的简化写法。
一、示例程序
下面来一个示例对比代码,如下所示:
fun elvisTest() {
var b: String? = "oyp"
var len1 = if (b != null) b.length else -1
//输出3
println(len1)
b = null
var len2 = b?.length ?: -1
// 输出 -1
println(len2)
}
len1 使用的是传统的if分支进行判断,当b不为null的时候返回b.length,否则返回-1
二、Elvis运算符
2.1 Elvis介绍
len2 使用的是 ?:
运算符,该运算符就是Elvis,
它的含义是,如果
?:
左边的表达式不为null,则返回左边表达式的值,否则返回?:
右边表达式的值。
由此可见, ?:
其实就是 if分支的简化写法。
2.2 Elvis分析
Elvis 操作符与安全调用符 ?. 配合使用时,一定要考虑到安全调用符前后是否为空,否则就会带来流程控制混乱的问题。对于刚才例子中的表达式:
val v = a?.b ?: c
因为 ?. 的优先级比 ?: 高,
首先计算 a?.b,按照安全调用符的规则,如果 a == null 则结果为 null,执行 c,
但如果 a.b == null,也会执行 c。
也就是说,它的执行逻辑是这样的:
var temp = if(a != null) a.b else null
val v = if(temp != null) temp else c
它等价于:
val v = if(a == null || a.b == null) c else a.b
所以我们上面介绍的例子,可以这样分析
var len2 = b?.length ?: -1
等价于
var len2 = if(b == null || b.length == null) -1 else b.length
2.3 Elvis与return、throw表达式
由于Kotlin中return、throw都属于表达式,因此它们也可以在 ?:
运算符的右边。
示例代码:
fun foo(node: Node): String? {
val parent = node.getParent() ?: return null
val name = node.getName() ?: throw IllegalArgumentException("name expected")
// ...
}
来源:oschina
链接:https://my.oschina.net/u/4419051/blog/4493054