Kotlin Tutorial(5)決策與判斷 by Michael | CodeData
top

Kotlin Tutorial(5)決策與判斷

分享:

Kotlin Tutorial(4)基本型態與變數 << 前情

Kotlin提供基本的流程控制敘述,包含if、else if、else,大部份程式語言都會提供的switch,kotlin改為更加方變的when。除了跟一般程式類似的流程控制敘述,kotlin把if和when設定為「運算式」,對於應用程式很多需求,都可以簡化程式的設計。

if敘述

所有程式語言都會提供「if」這類敘述,用來執行基本的判斷與流程的控制,Kotlin提供下面的if語法:

if (邏輯運算式) {
    邏輯運算式的結果為true,執行這裡的程式碼
}
[else if (邏輯運算式) {
    邏輯運算式的結果為true,執行這裡的程式碼
}]
[else {
    上面的判斷結果為false,執行這裡的程式碼
}]

應用程式依照流程的需求,使用if,或是搭配else if與else,執行需要的判斷與執行不同的工作,例如下面這個依照顏色代碼決定名稱的範例程式:

/* net.macdidi5.kotlin.tutorial.ch05.HelloIf01.kt */

package net.macdidi5.kotlin.ch05

fun main(args: Array<String>) {
    // 字元型態的顏色代碼
    val colorCode = 'R'
    // 字串型態的顏色名稱
    var colorName: String

    // 判斷顏色代碼是否為紅色
    if (colorCode == 'R') {
        colorName = "Red"
    }
    // 判斷顏色代碼是否為藍色
    else if (colorCode == 'B') {
        colorName = "Blue"
    }
    // 判斷顏色代碼是否為綠色
    else if (colorCode == 'G') {
        colorName = "Green"
    }
    // 錯誤的顏色代碼
    else {
        colorName = "undefined"
    }

    // 顯示: colorCode: R, colorName: Red
    println("colorCode: $colorCode, colorName: $colorName")
}

如果if、else if或else需要執行的工作只有一行敘述,可以省略{與}:

/* net.macdidi5.kotlin.tutorial.ch05.HelloIf02.kt */

package net.macdidi5.kotlin.tutorial.ch05

fun main(args: Array<String>) {
    val colorCode: Char = 'R'
    var colorName: String

    if (colorCode == 'R')
        colorName = "Red"
    else if (colorCode == 'B')
        colorName = "Blue"
    else if (colorCode == 'G')
        colorName = "Green"
    else
        colorName = "undefined"

    // 顯示: colorCode: R, colorName: Red
    println("colorCode: $colorCode, colorName: $colorName")
}

if運算式

使用if敘述執行條件的判斷,根據判斷的結果執行不同的工作,是一般程式常見的應用。應用程式也經常根據判斷的結果,決定一個變數的值,例如上面根據顏色代碼的值設定顏色的名稱。所以Kotlin把if設計為一個可以傳回值的「運算式」:

if (邏輯運算式) {
    邏輯運算式的結果為true,執行這裡的程式碼
    使用運算式傳回結果
}
[else if (邏輯運算式) {
    邏輯運算式的結果為true,執行這裡的程式碼
    使用運算式傳回結果        
}]
else {
    把if當成運算式的時候,一定要使用else
    上面的判斷結果為false,執行這裡的程式碼
    使用運算式傳回結果        
}

根據顏色代碼的值設定顏色名稱的範例,可以改寫為使用if運算式的寫法:

/* net.macdidi5.kotlin.tutorial.ch05.HelloIf03.kt */

package net.macdidi5.kotlin.tutorial.ch05

fun main(args: Array<String>) {
    val colorCode: Char = 'R'
    // 宣告變數指定的值為if運算式
    val colorName =
            if (colorCode == 'R') {
                println("R => Red")
                // if運算式傳回的值
                "Red"
            }
            else if (colorCode == 'B') {
                println("B => Blue")
                // if運算式傳回的值
                "Blue"
            }
            else if (colorCode == 'G') {
                println("G => Green")
                // if運算式傳回的值
                "Green"
            }
            else {
                println("other => undefined")
                // if運算式傳回的值
                "undefined"
            }

    println("colorCode: $colorCode, colorName: $colorName")
    // 執行後顯示:
    // R => Red
    // colorCode: R, colorName: Red
}

如果if、else if或else只需要使用運算式回傳值,可以省略{與}:

/* net.macdidi5.kotlin.tutorial.ch05.HelloIf03.kt */

package net.macdidi5.kotlin.tutorial.ch05

fun main(args: Array<String>) {
    val colorCode: Char = 'R'
    val colorName =
            if (colorCode == 'R')      "Red"
            else if (colorCode == 'B') "Blue"
            else if (colorCode == 'G') "Green"
            else                       "undefined"

    // 顯示: colorCode: R, colorName: Red
    println("colorCode: $colorCode, colorName: $colorName")
}

Kotlin沒有像Java程式語言的「?:」運算式,因為可以很容易使用if運算式執行同樣的工作,例如下面這個判斷數字大小的範例:

/* net.macdidi5.kotlin.tutorial.ch05.HelloIf05.kt */

package net.macdidi5.kotlin.tutorial.ch05

fun main(args: Array<String>) {
    val x = 3
    val y = 5

    val max = if (x > y) x else y

    // 顯示: x: 3, y: 5, max: 5
    println("x: $x, y: $y, max: $max")
}

when敘述

除了基本的if敘述,程式語言另外提供「switch」敘述,執行單一變數值的相等判斷。Kotlin提供「when」執行與switch敘述類似的工作:

when (運算式,用來判斷的資料) {
    值[,值...] -> 判斷的資料等於前面的值,執行這裡的程式碼
    [...]
    [else -> 判斷的資料不等於前面指定的值,執行這裡的程式碼]
}

前面使用if敘述判斷顏色代碼並設定顏色名稱的範例,可以改寫成使用when敘述的寫法:

/* net.macdidi5.kotlin.tutorial.ch05.HelloIf01.kt */

package net.macdidi5.kotlin.tutorial.ch05

fun main(args: Array<String>) {
    // 字元型態的顏色代碼
    val colorCode: Char = 'R'
    // 字串型態的顏色名稱
    var colorName: String

    // 判斷顏色代碼變數值
    when (colorCode) {
        'R' ->  colorName = "Red"
        'B' ->  colorName = "Blue"
        'G' ->  colorName = "Green"
        else -> colorName = "undefined"
    }

    // 顯示: colorCode: R, colorName: Red
    println("colorCode: $colorCode, colorName: $colorName")
}

Kotlin的when敘述可以判斷多個值,如果需要考慮大、小寫的顏色代碼,可以使用下面的作法:

/* net.macdidi5.kotlin.tutorial.ch05.HelloIf02.kt */

package net.macdidi5.kotlin.tutorial.ch05

fun main(args: Array<String>) {
    val colorCode: Char = 'r'
    var colorName: String

    when (colorCode) {
        // 使用多個值判斷大、小寫
        'R','r' ->  colorName = "Red"
        'B','b' ->  colorName = "Blue"
        'G','g' ->  colorName = "Green"
        else -> colorName = "undefined"
    }

    // 顯示: colorCode: r, colorName: Red
    println("colorCode: $colorCode, colorName: $colorName")
}

Kotlin的when敘述省略判斷資料的時候,必須在when敘述裡面使用邏輯運算式執行條件的判斷:

when {
    邏輯運算式 -> 邏輯運算式的結果為true,執行這裡的程式碼
    [...]
    [else -> 邏輯運算式的結果為false,執行這裡的程式碼]
}    

前面判斷顏色代碼並設定顏色名稱的範例,可以使用下面這個程式的作法:

/* net.macdidi5.kotlin.tutorial.ch05.HelloIf02.kt */

package net.macdidi5.kotlin.tutorial.ch05

fun main(args: Array<String>) {
    val colorCode: Char = 'R'
    var colorName: String

    when {
        colorCode == 'R' ->  colorName = "Red"
        colorCode == 'B' ->  colorName = "Blue"
        colorCode == 'G' ->  colorName = "Green"
        else -> colorName = "undefined"
    }

    // 顯示: colorCode: R, colorName: Red
    println("colorCode: $colorCode, colorName: $colorName")
}

when運算式

Kotlin把when設計為敘述與運算式兩種用法,下面是when運算式的語法:

when (運算式,用來判斷的資料) {
    值[,值...] -> 判斷的資料等於前面的值,使用運算式傳回結果
    [...]
    [else -> 判斷的資料不等於前面指定的值,使用運算式傳回結果]
}

根據顏色代碼的值設定顏色名稱的範例,可以改寫為使用when運算式的作法:

/* net.macdidi5.kotlin.tutorial.ch05.HelloIf03.kt */

package net.macdidi5.kotlin.tutorial.ch05

fun main(args: Array<String>) {
    val colorCode: Char = 'R'
    // 宣告變數指定的值為when運算式
    var colorName =
            when (colorCode) {
                'R' ->  "Red"
                'B' ->  "Blue"
                'G' ->  "Green"
                else -> "undefined"
            }

    // 顯示: colorCode: R, colorName: Red
    println("colorCode: $colorCode, colorName: $colorName")
}

when運算式同樣提供省略判斷資料的語法:

when {
    邏輯運算式 -> 邏輯運算式的結果為true,使用運算式傳回結果
    [...]
    [else -> 邏輯運算式的結果為false,使用運算式傳回結果]
}    

前面判斷顏色代碼並設定顏色名稱的範例,可以使用下面程式的作法:

/* net.macdidi5.kotlin.tutorial.ch05.HelloIf04.kt */

package net.macdidi5.kotlin.tutorial.ch05

fun main(args: Array<String>) {
    val colorCode: Char = 'R'
    // 宣告變數指定的值為when運算式
    var colorName =
            when {
                colorCode == 'R' ->  "Red"
                colorCode == 'B' ->  "Blue"
                colorCode == 'G' ->  "Green"
                else -> "undefined"
            }

    // 顯示: colorCode: R, colorName: Red
    println("colorCode: $colorCode, colorName: $colorName")
}

下一步

瞭寫使用if與when控制程式流程以後,接下來準備認識while、do-while與for三種迴圈,為應用程式加入執行重複工作的敘述,還有認識Kotlin方便、好用的範圍運算式。

相關的檔案都可以在GitHub瀏覽與下載。

https://github.com/macdidi5/Kotlin-Tutorial

後續 >> Kotlin Tutorial(6)迴圈與範圍

分享:
按讚!加入 CodeData Facebook 粉絲群

相關文章

留言

留言請先。還沒帳號註冊也可以使用FacebookGoogle+登錄留言