在 Kotlin 上實現三元運算子(Ternary Operator)
3 min readOct 16, 2020
所謂的三元運算子指的在一個條件判斷後面會接著一個問號,
當條件成立時在冒號前的表達式會被執行,
若當條件不成立,在冒號後面的表達式會被執行,
我們可以當成是 if/else 的簡化版。
在 Java 上的實踐:
boolean isTrue = true;
String str = isTrue ? "Good" : "Bad";
System.out.print(str);// output -> Good
在 Kotlin 上就只能用 if/else 來完成,書寫起來的流暢度,我自己是覺得沒有 Java 的方便啦!
val isTrue = true
val str = if (isTrue) "Good" else "Bad"
print(str)// output -> Good
在 Kotlin 我們其實可以用以下兩種的方式來完成
(1)
val isTrue = true
val str = isTrue yes { "Good" } no { "Bad" }// output -> Good
實現的方式如下:
data class TernaryOperator<T>(val trueValue: () -> T, val bool: Boolean)
infix fun <T> Boolean.yes(trueValue: () -> T) = TernaryOperator(trueValue, this)
inline infix fun <T> TernaryOperator<T>.no(falseValue: () -> T): T {
return if (bool) trueValue() else falseValue()
}
主要就是利用 infix + extension function 的特性把值傳出去而已。
(2)
第二種方式用法稍微不一樣,但實現起來較為簡單
val isTrue = true
val str = isTrue then { "Good" } ?: "Bad"// output -> Good
也是利用 infix + extension function ,若為 false 就丟 null 出去,再搭配 null check 來處理賦值。
infix fun <T : Any?> Boolean?.then(block: () -> T): T? = if (this == true) block() else null
結語:
我一直以來寫 Dart or Java 都滿常用三元運算子來做簡單的賦值,
但與用 Kotlin 自己實現相比起來好不好用就見仁見智了 🤣
有什麼問題或是有更好的概念都歡迎留言給我唷!