> For the complete documentation index, see [llms.txt](https://kuroclass.gitbook.io/kotlin/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kuroclass.gitbook.io/kotlin/ch4/yong-luo-ji-kong-zhi-yi-qie.md).

# 用邏輯控制一切！

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

## if/else語句

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

{% code title="ex. 4-1" %}

```kotlin
fun main() {
    var busArriveMinute = 5

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

{% endcode %}

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

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

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

* “( )”裡面可以放進“一句可以運算出布林值”的語句
* “{ }”裡面放入“如果上面的語句為true”時要執行的事情

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

* “{ }”裡面放入“if那邊的( )內的語句為false”時要執行的事情
* else不可以單獨存在

### 我還需要更多！

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

{% code title="ex. 4-2" %}

```kotlin
fun main() {
    var busArriveMinute = 5

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

{% endcode %}

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

* “( )”裡面可以放進“一句可以運算出布林值”的語句
* “{ }”裡面放入“如果上面的語句為true”時要執行的事情
* 必須跟在“if”後面

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

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

{% code title="ex. 4-3" %}

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

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

{% endcode %}

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

> “雖然巢狀條件判斷可以讓我們加入越來越多判斷條件，可是一旦條件變得越來越多，我們寫出來的Code也會變得越來&#x8D8A;***巢***。這樣不僅會妨礙我們閱讀，同時也容易造成維護上的困難，所以除非不得已的情況，建議儘量避免使用巢狀條件判斷。例如上面的範例，其實也可以改成這樣”
>
> ```kotlin
> 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這個函式。如果我們今天需要修改輸出資訊的方式，就會需要每個地方都改。這樣工作不僅繁瑣，也增加了不小心沒有改到的風險。那要怎麼解決呢？我們先來看看下面的例子：

{% code title="ex. 4-4" %}

```kotlin
fun main() {
    var busArriveMinute = 5

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

    println(showText)
}
```

{% endcode %}

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

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

### 刪除 { } (避免使用)

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

{% code title="ex. 4-5" %}

```kotlin
fun main() {
    var busArriveMinute = 5

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

    println(showText)
}
```

{% endcode %}

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

## Range

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

```kotlin
x > 0 && x <= 3
```

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

{% code title="ex. 4-6" %}

```kotlin
fun main() {
    var busArriveMinute = 5

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

    println(showText)
}
```

{% endcode %}

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

### rangeTo

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

### contains

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

## when運算式

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

{% code title="ex. 4-7" %}

```kotlin
fun main() {
    var busArriveMinute = 5

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

    println(showText)
}
```

{% endcode %}

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