前言
当初参加Kotlin读书会的时候听到Elvis Operator的来历觉得很酷,在之后写kotlin的时候也时常会使用到,算是很实用的运算子。
Elvis Operator其实是来自猫王的名字 - Elvis Presley,据说是因为当初创造这个运算子出来的人觉得这个运算子看起来很像猫王... 但其实我觉得比较像JOJO
用法
Result = First Operant ?: Second Operant
Elvis Operator 非常直观,
当 First Operant 的内容"不为" Null 时,则回传 First Operant当 First Operant 的内容"为" Null 时,则回传 Second Operant也可以理解为右侧运算元是当左侧运算元为 Null 时的回传预设值
给个栗子
1. 正常用法
var firstOperant1: String? = "I'm not null"var firstOperant2: String? = null// Return First Operantvar result1 = firstOperant1 ?: "Secondary Not-Null String"println("$result1") // print I'm not null// Return Second Operantvar result2 = firstOperant2 ?: "Secondary Not-Null String"println("$result2") // print Secondary Not-Null String
2. 可以用在 Funtion 的 Return
fun retrieveString(firstOperant: String?): String { return firstOperant ?: "Secondary Not-Null String"}println(retrieveString("I'm not null")) // print I'm not nullprintln(retrieveString(null)) // print Secondary Not-Null String
3. 可以 Return Exception
fun retrieveString(firstOperant: String?): String { return firstOperant ?: throw IllegalArgumentException("The firstOperant is null! Oops!")}println(retrieveString("I'm not null")) // print I'm not nullprintln(retrieveString(null)) // print exception message
4. 神级用法,目前还没有这么使用过
val numList = listOf(1, 2, 3, 4, 5)val result1 = numList.firstOrNull { it == 4 } ?: numList.firstOrNull { it == 5 } ?: "Oops"println("$result1") // print 4val result2 = numList.firstOrNull { it == 5 } ?: numList.firstOrNull { it == 6 } ?: "Oops"println("$result2") // print 5val result3 = numList.firstOrNull { it == 6 } ?: numList.firstOrNull { it == 7 } ?: "Oops"println("$result3") // print Oops
结论
或许你看到这边会想说 ?: 就是一个null check的运算子,为什么不按照Java的写法?val resutl = if(firstOperant != null) firstOperant else secondOperant
其实可以,这两种写法其实是没有差别的,但若採用 Elvis Operator 的话,整体上可以少写一点 code,所以如果让我选择我还是会偏好前者的写法。
另外还有一个很重要的原因!!!多用帅哥命名的运算子写code,或许我也会变比较帅吧
本文章同时发布于[Android在走,Kotlin要有]系列文章
https://www.coderbridge.com/@RobinChien/f84fef99ba074b16aa520c7f095fe737