在 Kotlin 上實現三元運算子(Ternary Operator)

Joseph Wang
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 自己實現相比起來好不好用就見仁見智了 🤣
有什麼問題或是有更好的概念都歡迎留言給我唷!

--

--

No responses yet