當初參加Kotlin讀書會的時候聽到Elvis Operator的來歷覺得很酷,在之後寫kotlin的時候也時常會使用到,算是很實用的運算子。
Elvis Operator其實是來自貓王的名字 - Elvis Presley,據說是因為當初創造這個運算子出來的人覺得這個運算子看起來很像貓王... 但其實我覺得比較像JOJO
Result = First Operant ?: Second Operant
Elvis Operator 非常直觀,
也可以理解為右側運算元是當左側運算元為 Null 時的回傳預設值
var firstOperant1: String? = "I'm not null"
var firstOperant2: String? = null
// Return First Operant
var result1 = firstOperant1 ?: "Secondary Not-Null String"
println("$result1") // print I'm not null
// Return Second Operant
var result2 = firstOperant2 ?: "Secondary Not-Null String"
println("$result2") // print Secondary Not-Null String
fun retrieveString(firstOperant: String?): String {
return firstOperant ?: "Secondary Not-Null String"
}
println(retrieveString("I'm not null")) // print I'm not null
println(retrieveString(null)) // print Secondary Not-Null String
fun retrieveString(firstOperant: String?): String {
return firstOperant ?: throw IllegalArgumentException("The firstOperant is null! Oops!")
}
println(retrieveString("I'm not null")) // print I'm not null
println(retrieveString(null)) // print exception message
val numList = listOf(1, 2, 3, 4, 5)
val result1 = numList.firstOrNull { it == 4 } ?: numList.firstOrNull { it == 5 } ?: "Oops"
println("$result1") // print 4
val result2 = numList.firstOrNull { it == 5 } ?: numList.firstOrNull { it == 6 } ?: "Oops"
println("$result2") // print 5
val 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