Kotlin 的流程控制,咱們分爲兩部分來介紹,第一部分是條件語句,第二部分是循環語句。今天咱們首先看一下 Kotlin 中的條件語句:java
做爲一門更加現代的編程語言,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,咱們能把邏輯寫得清清楚楚,讓代碼變得簡潔清晰:app
// 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 部分:ide
咱們val a = 1val b = 0val max = if (a <= b) b看一下上面的語句,由於 a <= b 的結果爲 false,因此代碼並不會執行到將 b 賦給 max 的部分,max 其實是 null, 這時咱們再執行其餘語句就會出現錯誤。Kotlin 爲避免出現這樣的問題,在編譯時就要求,做爲表達式使用的 if 語句,必需要有 else 語句與之搭配,不然就會出現編譯錯誤。函數
在初學 C 和 Java 的 switch 語句時,我被它坑得不淺,用幾個布爾表達式做爲選擇分支的條件,結果天然是編譯錯誤。仔細查看語法規範才明白,C 的 switch 語句只能把整數常量做爲判斷條件,Java 的選擇大一點,卻也只擴大到整數的封裝類、字符串和枚舉,一旦加入一點複雜的邏輯,咱們就得用成堆的 if - else 語句,難道咱們就不能把布爾表達式做爲判斷分支的條件嗎?Kotlin 作到了這一點。spa
Kotlin 使用 when 語句替代類 C 語言中的 switch 語句,但它比 switch 更增強大。orm
首先,switch 能作的,when 也能作:ci
// 輸入 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 部分,不然會出現編譯錯誤。