用邏輯控制一切!

很多時候我們會需要“利用一些條件,決定我們要執行的事項”,接下來我們就來看看在Kotlin裡面常見的幾種條件語法吧!

if/else語句

首先我們先來看這個範例:

ex. 4-1
fun main() {
    var busArriveMinute = 5

    if (busArriveMinute == 0) {
        println("將到站")
    } else {
        println("${busArriveMinute}分鐘")
    }
}

我們可以看到這邊多了兩個關鍵字 “if” 跟 “else”,首先我們先來看看“if”的部分:

如果......怎麼樣的時候......就做什麼事......否則......就做另一件事

首先我們看到在“if“後面會跟著一對“( )”跟一對“{ }”

  • “( )”裡面可以放進“一句可以運算出布林值”的語句

  • “{ }”裡面放入“如果上面的語句為true”時要執行的事情

再來我們看到“else”後面有一對“{ }”

  • “{ }”裡面放入“if那邊的( )內的語句為false”時要執行的事情

  • else不可以單獨存在

我還需要更多!

上面介紹的“if/else”只能容納兩個條件,可是如果我們需要更多更多條件的話怎麼辦? 這個時候就需要“else if”出場啦!

ex. 4-2
fun main() {
    var busArriveMinute = 5

    if (busArriveMinute == 0) {
        println("進站中")
    } else if (busArriveMinute <= 3) {
        println("將到站")
    } else {
        println("${busArriveMinute}分鐘")
    }
}

“else if”具備“if”跟“else”的部分性質

  • “( )”裡面可以放進“一句可以運算出布林值”的語句

  • “{ }”裡面放入“如果上面的語句為true”時要執行的事情

  • 必須跟在“if”後面

巢狀條件語句(避免使用)

有些時候我們會需要多項條件才能做出判斷,這個時候我們可以在條件的執行區塊裡面再加入條件語句:

ex. 4-3
fun main() {
    var busArriveMinute = 5
    var shouldStop = true

    if (shouldStop) {
        if (busArriveMinute == 0) {
            println("進站中")
        } else if (busArriveMinute <= 3) {
            println("將到站")
        } else {
            println("${busArriveMinute}分鐘")
        }
    } else {
        println("不停靠")
    }
}

透過巢狀條件語句,我們可以加入多項條件完成判斷,讓我們的程式可以處理更多、更複雜的條件判斷

“雖然巢狀條件判斷可以讓我們加入越來越多判斷條件,可是一旦條件變得越來越多,我們寫出來的Code也會變得越來越。這樣不僅會妨礙我們閱讀,同時也容易造成維護上的困難,所以除非不得已的情況,建議儘量避免使用巢狀條件判斷。例如上面的範例,其實也可以改成這樣”

fun main() {
    var busArriveMinute = 5
    var shouldStop = true

    if (busArriveMinute == 0 && shouldStop) {
        println("進站中")
    } else if (busArriveMinute <= 3 && shouldStop) {
        println("將到站")
    } else if (shouldStop) {
        println("${busArriveMinute}分鐘")
    } else {
        println("不停靠")
    }
}

條件運算式

接下來回到ex. 4-2裡面,我們會發現每個if/else區塊裡面,都有使用println這個函式。如果我們今天需要修改輸出資訊的方式,就會需要每個地方都改。這樣工作不僅繁瑣,也增加了不小心沒有改到的風險。那要怎麼解決呢?我們先來看看下面的例子:

ex. 4-4
fun main() {
    var busArriveMinute = 5

    val showText = if (busArriveMinute == 0) {
        "進站中"
    } else if (busArriveMinute <= 3) {
        "將到站"
    } else {
        "${busArriveMinute}分鐘"
    }

    println(showText)
}

在這個例子裡面我們會發現if/else語句可以“產生”一個值出來,然後設定給變數。具體來說我們可以使用判斷語句回傳值,而如果我們這樣做的話,將會輸出判斷區塊的最後一行輸出結果。這樣一來,我們就可以將輸出跟判斷的部分分開來撰寫,更容易閱讀、維護

這邊有一個值得注意的地方,就是如果我們要用條件判斷回傳數值,在最後都必須要加上else,以確保在任何條件下,都會有數值回傳

刪除 { } (避免使用)

在分支區塊裡面如果只有一行語句的情況,我們可以把“{ }”省略掉

ex. 4-5
fun main() {
    var busArriveMinute = 5

    val showText = if (busArriveMinute == 0) "進站中"
    else if (busArriveMinute <= 3) "將到站"
    else "${busArriveMinute}分鐘"

    println(showText)
}

‘為什麼儘量不要刪除{ }?’

“在我們刪除{ }之後,可以發現區塊的界線變得不明確,尤其是當區塊內的語句不只一行的時候。就會越來越難閱讀,而且會容易搞錯區塊的範圍,造成不必要的麻煩,所以大部分的開發者都不太會這樣做”

Range

在有一些語言裡面,這種多個數字區間要做判斷的寫法大多會用刪去法,不然就是得要使用

x > 0 && x <= 3

這種看起來不怎麼漂亮也比較不直觀的寫法。不過在Kotlin裡面提供了一個方便的數值範圍判斷工具:Range,接下來我們可以看看要怎麼使用Range改寫ex. 4-5裡面的判斷式

ex. 4-6
fun main() {
    var busArriveMinute = 5

    val showText = if (busArriveMinute == 0) "進站中"
    else if (busArriveMinute in 1..3) "將到站"
    else "${busArriveMinute}分鐘"

    println(showText)
}

這個範例裡面出現了兩個新的運算子“in”還有“..”,首先我們來介紹“..”:

rangeTo

“..”是一個用來標示某個範圍的運算子,在上面範例的“1..3”代表“從1開始到3為止”的數字範圍

contains

“in”則是用來檢查左邊的數值,有沒有包含在右邊的範圍裡面

when運算式

當我們判斷的條件越來越多的時候,我們會覺得要寫很多if/else if/else if/....../else這樣顯得太笨重,而且讀起來依舊不夠直覺。在Kotlin裡面我們有更直覺的方法可以表示,那就是when運算式

ex. 4-7
fun main() {
    var busArriveMinute = 5

    val showText = when (busArriveMinute) {
        0 -> "進站中"
        in 1..3 -> "將到站"
        else -> "${busArriveMinute}分鐘"
    }

    println(showText)
}

在這個例子裡面我們可以看到when運算式的表示方式,在Kotlin裡面只要有用到else if的時候都建議更改成when運算式,而when運算式也有著else if沒有的一些優點,這個我們會在後面的講道列舉跟封裝類別的時候來探討。

Last updated