Skip to content

控制流程

如同其他程式語言,Kotlin 能夠根據一段程式碼的求值結果是否為 true 來做出決策。這類程式碼被稱為條件運算式(conditional expression)。Kotlin 也能夠建立並疊代迴圈。

條件運算式

Kotlin 提供 ifwhen 來檢查條件運算式。

如果您必須在 ifwhen 之間做出選擇,我們建議使用 when,因為它:

  • 讓您的程式碼更易於閱讀。
  • 讓增加另一個分支變得更容易。
  • 減少程式碼中的錯誤。

If

若要使用 if,請將條件運算式放在圓括號 () 中,並將結果為 true 時要執行的操作放在花括號 {} 中:

kotlin
fun main() {
    val d: Int
    val check = true

    if (check) {
        d = 1
    } else {
        d = 2
    }

    println(d)
    // 1
}

Kotlin 中沒有三元運算子 condition ? then : else。相反地,if 可以作為運算式使用。如果每個操作只有一行程式碼,則花括號 {} 是可選的:

kotlin
fun main() { 
    val a = 1
    val b = 2

    println(if (a > b) a else b) // 傳回一個值:2
}

When

當您有一個具有多個分支的條件運算式時,請使用 when

若要使用 when

  • 將您要求值的值放在圓括號 () 中。
  • 將分支放在花括號 {} 中。
  • 在每個分支中使用 -> 將每次檢查與檢查成功時要執行的操作隔開。

when 可以作為陳述式或運算式使用。陳述式(statement)不傳回任何內容,而是執行操作。

以下是將 when 作為陳述式使用的範例:

kotlin
fun main() {
    val obj = "Hello"

    when (obj) {
        // 檢查 obj 是否等於 "1"
        "1" -> println("One")
        // 檢查 obj 是否等於 "Hello"
        "Hello" -> println("Greeting")
        // 預設陳述式
        else -> println("Unknown")     
    }
    // Greeting
}

請注意,所有分支條件都會按順序檢查,直到其中一個滿足為止。因此,只有第一個合適的分支會被執行。

運算式(expression)會傳回一個值,供稍後在程式碼中使用。

以下是將 when 作為運算式使用的範例。when 運算式會立即指派給一個變數,該變數稍後會與 println() 函式一起使用:

kotlin
fun main() {
    val obj = "Hello"    
    
    val result = when (obj) {
        // 如果 obj 等於 "1",將 result 設定為 "One"
        "1" -> "One"
        // 如果 obj 等於 "Hello",將 result 設定為 "Greeting"
        "Hello" -> "Greeting"
        // 如果沒有滿足之前的條件,則將 result 設定為 "Unknown"
        else -> "Unknown"
    }
    println(result)
    // Greeting
}

到目前為止您看到的 when 範例都有一個主體:obj。但 when 也可以在沒有主體的情況下使用。

此範例使用不帶主體的 when 運算式來檢查一系列布林運算式:

kotlin
fun main() {
    val trafficLightState = "Red" // 這可以是 "Green"、"Yellow" 或 "Red"

    val trafficAction = when {
        trafficLightState == "Green" -> "Go"
        trafficLightState == "Yellow" -> "Slow down"
        trafficLightState == "Red" -> "Stop"
        else -> "Malfunction"
    }

    println(trafficAction)
    // Stop
}

然而,您也可以使用相同的程式碼,但將 trafficLightState 作為主體:

kotlin
fun main() {
    val trafficLightState = "Red" // 這可以是 "Green"、"Yellow" 或 "Red"

    val trafficAction = when (trafficLightState) {
        "Green" -> "Go"
        "Yellow" -> "Slow down"
        "Red" -> "Stop"
        else -> "Malfunction"
    }

    println(trafficAction)  
    // Stop
}

使用帶有主體的 when 可以讓您的程式碼更易於閱讀和維護。當您在 when 運算式中使用主體時,它還能協助 Kotlin 檢查是否涵蓋了所有可能的情況。否則,如果您在 when 運算式中不使用主體,則需要提供一個 else 分支。

條件運算式練習

練習 1

建立一個簡單的遊戲,如果擲兩顆骰子得到的數字相同則獲勝。如果骰子數字相符,使用 if 印出 You win :),否則印出 You lose :(

TIP

在此練習中,您會匯入一個套件,以便使用 Random.nextInt() 函式來取得隨機的 Int。如需更多關於匯入套件的資訊,請參閱 套件與匯入

提示
使用 相等運算子 (==) 來比較骰子結果。
kotlin
import kotlin.random.Random

fun main() {
    val firstResult = Random.nextInt(6)
    val secondResult = Random.nextInt(6)
    // 在此處編寫您的程式碼
}
範例解答
kotlin
import kotlin.random.Random

fun main() {
    val firstResult = Random.nextInt(6)
    val secondResult = Random.nextInt(6)
    if (firstResult == secondResult)
        println("You win :)")
    else
        println("You lose :(")
}
練習 2

使用 when 運算式更新以下程式,以便在您輸入遊戲主機按鈕名稱時印出對應的操作。

按鈕操作
AYes
BNo
XMenu
YNothing
其他There is no such button
kotlin
fun main() {
    val button = "A"

    println(
        // 在此處編寫您的程式碼
    )
}
範例解答
kotlin
fun main() {
    val button = "A"
    
    println(
        when (button) {
            "A" -> "Yes"
            "B" -> "No"
            "X" -> "Menu"
            "Y" -> "Nothing"
            else -> "There is no such button"
        }
    )
}

For

利用您對範圍的新知識,您可以建立一個 for 迴圈來疊代數字 1 到 5,並每次印出該數字。

將迭代器和範圍放在圓括號 () 中,並使用關鍵字 in。將您想要完成的操作放在花括號 {} 中:

kotlin
fun main() {
    for (number in 1..5) { 
        // number 是迭代器,1..5 是範圍
        print(number)
    }
    // 12345
}

集合也可以透過迴圈進行疊代:

kotlin
fun main() { 
    val cakes = listOf("carrot", "cheese", "chocolate")

    for (cake in cakes) {
        println("Yummy, it's a $cake cake!")
    }
    // Yummy, it's a carrot cake!
    // Yummy, it's a cheese cake!
    // Yummy, it's a chocolate cake!
}

While

while 可以透過兩種方式使用:

  • 在條件運算式為 true 時執行程式碼區塊。(while)
  • 先執行程式碼區塊,然後再檢查條件運算式。(do-while)

在第一種使用情況 (while) 中:

  • 在圓括號 () 中宣告讓 while 迴圈繼續執行的條件運算式。
  • 在花括號 {} 中加入您想要完成的操作。

以下範例使用 累加運算子 ++ 來增加 cakesEaten 變數的值。

kotlin
fun main() {
    var cakesEaten = 0
    while (cakesEaten < 3) {
        println("Eat a cake")
        cakesEaten++
    }
    // Eat a cake
    // Eat a cake
    // Eat a cake
}

在第二種使用情況 (do-while) 中:

  • 在圓括號 () 中宣告讓 while 迴圈繼續執行的條件運算式。
  • 在關鍵字 do 後的花括號 {} 中定義您想要完成的操作。
kotlin
fun main() {
    var cakesEaten = 0
    var cakesBaked = 0
    while (cakesEaten < 3) {
        println("Eat a cake")
        cakesEaten++
    }
    do {
        println("Bake a cake")
        cakesBaked++
    } while (cakesBaked < cakesEaten)
    // Eat a cake
    // Eat a cake
    // Eat a cake
    // Bake a cake
    // Bake a cake
    // Bake a cake
}

如需更多關於條件運算式與迴圈的資訊和範例,請參閱 條件與迴圈

現在您已經了解 Kotlin 控制流程的基礎知識,是時候學習如何編寫您自己的 函式 了。

迴圈練習

練習 1

您有一個程式會計算披薩切片,直到湊成一個包含 8 片的完整披薩。請以兩種方式重構此程式:

  • 使用 while 迴圈。
  • 使用 do-while 迴圈。
kotlin
fun main() {
    var pizzaSlices = 0
    // 在此開始重構
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    println("There's only $pizzaSlices slice/s of pizza :(")
    pizzaSlices++
    // 在此結束重構
    println("There are $pizzaSlices slices of pizza. Hooray! We have a whole pizza! :D")
}
範例解答 1
kotlin
fun main() {
    var pizzaSlices = 0
    while ( pizzaSlices < 7 ) {
        pizzaSlices++
        println("There's only $pizzaSlices slice/s of pizza :(")
    }
    pizzaSlices++
    println("There are $pizzaSlices slices of pizza. Hooray! We have a whole pizza! :D")
}
範例解答 2
kotlin
fun main() {
    var pizzaSlices = 0
    pizzaSlices++
    do {
        println("There's only $pizzaSlices slice/s of pizza :(")
        pizzaSlices++
    } while ( pizzaSlices < 8 )
    println("There are $pizzaSlices slices of pizza. Hooray! We have a whole pizza! :D")
}
練習 2

撰寫一個模擬 Fizz buzz 遊戲的程式。您的任務是遞增地印出 1 到 100 的數字,將任何可被 3 整除的數字替換為單字 "fizz",任何可被 5 整除的數字替換為單字 "buzz"。任何同時可被 3 和 5 整除的數字必須替換為單字 "fizzbuzz"。

提示 1
使用 for 迴圈來計數,並使用 when 運算式來決定在每一步印出什麼。
提示 2
使用餘數運算子 (%) 來獲取數字被除後的餘數。使用 相等運算子 (==) 來檢查餘數是否等於零。
kotlin
fun main() {
    // 在此處編寫您的程式碼
}
範例解答
kotlin
fun main() {
    for (number in 1..100) {
        println(
            when {
                number % 15 == 0 -> "fizzbuzz"
                number % 3 == 0 -> "fizz"
                number % 5 == 0 -> "buzz"
                else -> "$number"
            }
        )
    }
}
練習 3

您有一個單字列表。使用 forif 僅印出以字母 l 開頭的單字。

提示
針對 String 型別使用 .startsWith() 函式。
kotlin
fun main() {
    val words = listOf("dinosaur", "limousine", "magazine", "language")
    // 在此處編寫您的程式碼
}
範例解答
kotlin
fun main() {
    val words = listOf("dinosaur", "limousine", "magazine", "language")
    for (w in words) {
        if (w.startsWith("l"))
            println(w)
    }
}