流程控制:條件語句

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 部分,否則會出現編譯錯誤。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章