Kotlin教學 | 從零開始學Kotlin | Kotlin入門 | CH3: 分支(Branch)

分支

Kotlin提供ifwhen控制程式流程的語法。
根據不同的條件或範圍決定要執行哪一個分支的程式碼。

if expression

if-else語法,讓程式可以根據Boolean_Expression是否為真,決定要執行哪一個分支的程式碼區塊。

if-else陳述句(statement)

if (Boolean_Expression_1) {
    // executed_codes
}
else if (Boolean_Expression_2) {
    // executed_codes
}
else if (Boolean_Expression_N) {
    // executed_codes
}
else {
    // executed_codes
}
  • Boolean_Expression:回傳值truefalse的表達式。
  • if (Boolean_Expression_1):檢查Boolean_Expression_1的值是否為true,如果為true,則執行大括號{}內的程式碼。
  • else if (Boolean_Expression_N):如果前面的ifelse if的條件都是false,則檢查當前else ifBoolean_Expression_N的值是否為true,如果為true,則執行對應的大括號{}內的程式碼。
    else if條件可省略,如果不需要可以不用提供。
  • else:如果所有的ifelse if條件都不滿足,則執行else大括號{}內的程式碼。
    else 可省略,如果不需要可以不用提供。
  • 如果executed_codes只有一行,可以省略大括號{}

Example

var max = a
if (a < b) max = b

// With else
if (a > b) {
    max = a
} else {
    max = b
}

if-else表達式(expression)

在Kotlin中,if-else語法除了跟其他語言一樣是陳述句外,if-else還可以當作表達式返回值使用。
因此Kotlin不像其他程式語言,它不需要三元運算子(condition ? then : else),因為有返回值的if-else表達式可以取代這個角色。

當表達式使用時:

  • 返回值:大括號{}的最後一行即為返回值。(如果只有一行,那一行即為返回值)
  • else不可省略,必須包含else分支,保證if表達式都能返回一個值。

Example

下面範例是if-else當表達式使用來賦值給變數max

var max = a

// As expression with one line
max = if (a > b) a else b

// As expression with multiple line
val max = if (a > b) {
    print("Choose a")
    a // return a
} else {
    print("Choose b")
    b // return b
}
// use `else if` in expressions
val maxLimit = 1
val maxOrLimit = if (maxLimit > a) maxLimit else if (a > b) a else b

when expression

Kotlin使用when表達式處理多個分支的情況,它允許你根據一個變量或表達式的值而執行對應的程式碼區塊。
if-else可以做到的,when也都可以做到,但是在處理兩個以上條件分支時,它可比if-else更簡潔和容易閱讀。

Kotlin沒有switch語句,它使用when取代一般程式語言的switch多分支語句。

when陳述句

when的基本語法如下:

when (subject) {
    value1 -> { 
        //executed_codes
    }
    value2, value3 -> { 
        //executed_codes
    }
    in range -> { 
        //executed_codes
    }
    !in range -> { 
        //executed_codes
    }
    is Type -> { 
        //executed_codes
    }
    !is Type -> { 
        //executed_codes
    }
    else -> { 
        //executed_codes
    }
}
  • subject是你要檢查的變量或表達式。
  • value1:如果subject的值是value1,則執行對應{}內的程式碼。
  • value2, value3:如果subject的值是value2value3,則執行對應{}內的程式碼。
  • in rangerange是一個範圍,如果subject的值,落在這個範圍內,則執行對應{}內的程式碼。
  • !in rangerange是一個範圍,如果subject的值,不落在這個範圍內,則執行對應{}內的程式碼。
  • is TypeType是一個類型,如果subject的值是這個類型,則執行對應{}內的程式碼。
  • !is TypeType是一個類型,如果subject的值不是這個類型,則執行對應{}內的程式碼。
  • else:可省略。如果有提供,當沒有任何其他分支條件成立時,則執行對應{}內的程式碼。
  • 如果executed_codes只有一行,可以省略大括號{}

Example

when (x) {
    in 1..10 -> println("x is in the range")
    in validNumbers -> println("x is in the valid numbers")
    !in 10..20 -> println("x is outside the range")
    else -> println("none of the above")
}
when (x) {
    is Int -> println("x is an Int")
    is String -> println(x.length)
    else -> println("x is neither an Int nor a String")
}

when表達式

在Kotlin中,when還可以當作表達式返回值使用。

when作為表達式使用時:

  • 返回值:分支的大括號{}的最後一行即為返回值。(如果只有一行,那一行即為返回值)
  • else
    • 如果所有分支的條件無法包含subject所有可能的值,則else分支是必要的。
    • 除非所有分支的條件可以包含subject所有可能的值,則else分支可以不用。

Example

enum class Bit {
    ZERO, ONE
}

val numericValue = when (getRandomBit()) {
    Bit.ZERO -> 0
    Bit.ONE -> 1
    // 'else' is not required because all cases are covered
}

不帶變量的when

when可以不帶subject使用。
不帶subject時,每個分支條件會視為Boolean_Expression回傳為truefalse,等同ifelse if

Example

when {
    x.isOdd() -> print("x is odd")
    y.isEven() -> print("y is even")
    else -> print("x+y is odd")
}

使用when的區域變量

在Kotlin中,可以將whensubjectExpression賦值到variable變量中,這允許你在when的各個分支中重複使用該變量。這種做法特別有用於當需要重複使用subjectExpression的結果時。

Example

when(val tmp = "A"+"B"){
    "AA" -> println(tmp) //AB
    "AB" -> println(tmp+"C") //print ABC
}

Reference

https://kotlinlang.org/docs/control-flow.html

發佈留言