Kotlin 的流程控制,我們分爲兩部分來介紹,第一部分是條件語句,第二部分是循環語句。今天我們首先看一下 Kotlin 中的條件語句:
1. if - else 條件判斷語句
作爲一門更加現代的編程語言,Kotlin 中的 if 條件語句與其他類 C 語言相比,最大的區別在於if 語句本身就是個有返回值的表達式。我們用一個最簡單的 max 函數作一下對比:
// Java 語言寫法public static int max(int a, int b) { if (a <= b) return b; else return a; // 或者使用三目運算符 return (a <= b)?b:a;}
由於 if - else 語句在 Java 不是個表達式,我們必須在判斷條件後執行返回語句,這讓每個條件判斷變得臃腫無比。Java 爲了簡化條件判斷語句引入三目運算符,但濫用三目運算符的結果是,一長串 ? 和 : 把清晰的邏輯變得混亂不堪,讓代碼的可閱讀性變得十分低下。
然而,使用 Kotlin,我們能把邏輯寫得清清楚楚,讓代碼變得簡潔清晰:
// Kotlin 寫法fun max(a: Int, b: Int) = if(a <= b) b else a
當然,如果還是習慣不了這種過於簡潔的寫法,依然可以把 if 當作語句使用:
// Kotlin 中的傳統寫法fun max(a: Int, b: Int) { if (a <= b) return b else return a}
這裏我們有個地方需要注意,如果我們把 if 語句當作表達式使用,那麼一定要有 else 部分:
我們val a = 1val b = 0val max = if (a <= b) b看一下上面的語句,因爲 a <= b 的結果爲 false,所以代碼並不會執行到將 b 賦給 max 的部分,max 實際上是 null, 這時我們再執行其他語句就會出現錯誤。Kotlin 爲避免出現這樣的問題,在編譯時就要求,作爲表達式使用的 if 語句,必須要有 else 語句與之搭配,否則就會出現編譯錯誤。
2. when 條件選擇語句
在初學 C 和 Java 的 switch 語句時,我被它坑得不淺,用幾個布爾表達式作爲選擇分支的條件,結果自然是編譯錯誤。仔細查看語法規範才明白,C 的 switch 語句只能把整數常量作爲判斷條件,Java 的選擇大一點,卻也只擴大到整數的封裝類、字符串和枚舉,一旦加入一點複雜的邏輯,我們就得用成堆的 if - else 語句,難道我們就不能把布爾表達式作爲判斷分支的條件嗎?Kotlin 做到了這一點。
Kotlin 使用 when 語句替代類 C 語言中的 switch 語句,但它比 switch 更加強大。
首先,switch 能做的,when 也能做:
// 輸入 xwhen (x) { //判斷條件 -> 執行語句 1 -> println("x = 1") 2 -> println("x = 2") // 上面條件都不滿足時執行 else -> println("x is neither 1 nor 2")}
清晰無比。當 x 爲 1 時,打印 x = 1;當 x 爲 2 時,打印 x = 2;當上面的條件都不滿足時,打印 x is neither 1 nor 2。
簡化一下代碼吧,我們能輕易發現,當 x 爲 1 或 2 時,執行的其實是一個操作,於是我們可以這樣寫:
// 輸入 xwhen (x) { //使用 "," 分隔多個條件 1, 2 -> println("x = $x") else -> println("x is neither 1 nor 2")}
在這裏,Kotlin 的 when 語句就已經比 switch 語句高出一截了,但它更強大的還在後面:
// 輸入 xwhen (x) { !is Int -> println("x is not integer") in 0..10 -> println("x is between 0 and 10") else -> println("x is over 10")}
看吧,我們可以在判斷條件裏用兩種高級的表達式:
is 和 !is:判斷值是否是某個類的實例;
in 和 !in:判斷值是否在某個區間、數組和集合內;
我們還可以使用不帶參數的 when 語句,在相當程度上替代類 C 語言中的 if - else if - else 語句。
// 輸入 xwhen { x !is Int -> println("x is not Int") (x and 1) == 0 -> println("x is even") else -> println("x is odd")}
是不是比一大堆 if - else if - else 簡潔多了?
同樣,我們也可以把 when 用作表達式:
// 輸入 xval isOdd = when { (x and 1) == 1 -> true else -> false}
與 if 語句用作表達式時的要求一致,when 語句用作表達式時必須有 else 部分,否則會出現編譯錯誤。