《瘋狂Kotlin講義》讀書筆記4——流程控制

鳳青 發表於 2021-04-20

流程控制

與Java類似,Kotlin同樣提供了兩種基本的流程控制結構:分支結構迴圈結構

Kotlin提供了 if 和 when 兩種分支語句,其中 when 語句可以代替Java的switch語句,且功能更強大;Kotlin提供了 while 、do while 、for-in 迴圈,拋棄了Java原有的普通for迴圈。Kotlin也提供了 break 和 continue 來控制迴圈結構。

4.1 分支結構

4.2.1 if 分支

Kotlin中的 if 分支既可以作為語句使用,也可以作為表示式使用。

//作為語句使用的三種形式:
//形式1
if (expression) {
    statements...
}

//形式2
if (expression) {
    statements...
} else {
    statements...
}

//形式3
if (expression) {
    statements...
} else if (expression) {
    statements...
}
...
// 注意:使用if else語句時,一定要先處理範圍更小的情況

4.2.2 if 表示式

// if 作為表示式使用時:
var age = 20
//將if表示式賦值給str
var str = if (age > 20) "age大於20" else if (age < 20) "age小於20" 
		else "age等於20"   
//由上述程式碼可知,當if分支作為表示式使用時,整個if表示式最終會返回一個值,因此我們可以
//用它來代替Java中的三目運算子。
//注意:if表示式必須要有返回值

4.2.3 when分支語句

when分支取代了Java中原有的switch語句。

var score = 'B'
when (score) {
    'A' -> {
        println("You get a A !")
    }
    'B' -> {
        println("You get a B !")
    }
    'C' -> {
        println("You get a C !")
    }
    'D' -> {
        println("You get a D !")
    }
    else -> {
     	println("Flunk !")
    }
}

when分支相對於switch分支的改進:

  1. when分支可以匹配多個值。
  2. when分支後的值不要求是常量,可以是任意表示式。
  3. when分支對條件表示式的型別沒有任何要求。
// when分支可以匹配多個值
var score = 'B'
when (score) {
    'A', 'B' -> {
        println("優秀")
    }
    'C', 'D' -> {
        println("良好")
    }
}
// when分支後的值不要求是常量,可以是任意表示式
var score = 'B'
var str = "EFGH"
when (score) {
    str[0] - 4, str[1] - 4 -> {
        println("優秀")
    }
    str[2] - 4, str[3] - 4 -> println("良好")
}
// when分支的條件表示式可以是任意型別
var date = Date()
when (date) {  // 以Date型別作為when的條件表示式
    Date() -> {
        println("666")
    }
    else -> {
        println("555")
    }
}

4.2.4 when 表示式

與 if 分支相同,when分支也可以作為表示式使用。when表示式必須有返回值,因此when表示式必須有else分支。

var score = 'B'
val str = when (score) {
    'A' -> {
        println("666")
        "優秀"
    }
    'B' -> {
        println("it's ok")
        "良好"
    }
    else -> {
        println("555")
        "不及格"
    }
}
println(str)  //輸出:良好

4.2.5 when 分支處理範圍

通過使用 in 、 !in 運算子,我們還可以使用when分支檢查表示式是否位於指定區間或集合中。

val age = java.util.Random().nextInt(100)
//通過when表示式對str賦值
var str = when (age) {
    in 10..25 -> "年輕人"
    in 25..50 -> "中年人"
    in 51..80 -> "老年人"
    else -> "牛人"
}

4.2.6 when 分支處理型別

通過使用 is 、!is 運算子,我們可以使用when分支檢查表示式是否為指定型別。

var element: String = "hello world"
when (element) {
    is String -> println("String型別")
    is Int -> println("Int型別")
    is Double -> println("Double型別")
    else -> println("其他型別")
}

4.2.7 when條件分支

我們可以用when分支來代替 if..else if 鏈,具體程式碼不做贅述。

4.3 迴圈結構

4.3.1 while迴圈

與Java相同,不做贅述。

4.3.2 do while 迴圈

同上。

4.3.3 for - in 迴圈

for - in 迴圈格式如下:

for (常量名 in 字串 | 範圍 | 集合) {
    statements...
}

上述語法格式有兩點需要注意:

  1. for - in 迴圈中的常量無需宣告。 for - in 迴圈中的常量會在每次迴圈開始前自動被賦值,因此該常量無需提前宣告。
  2. for - in 迴圈可以遍歷任何可迭代物件。所謂的可迭代物件就是該物件包含一個iterator()方法,且該方法的返回值物件具有next()、hasNext()方法。
//for-in迴圈的簡單使用
for (num in 2..5) {
    println(num)
}

注意:for - in 迴圈中的迴圈計數相當於一個用val宣告的常量,因此程式不允許在for - in迴圈中對迴圈計數器進行賦值。

for (num in 2..5) {
    println(num)
   	num = 8;  //對迴圈計數器num進行賦值會報錯
}

4.3.4 巢狀迴圈

與Java相同,不做贅述。

4.4 迴圈控制結構

Kotlin提供了 continuebreak 來控制迴圈結構,除此之外還可以使用 return 來結束整個方法。

4.4.1 使用 break 結束迴圈

Kotlin中的break語句基本與Java型別,不過有一點值得一提:在Kotlin中,break語句不僅可以結束其所在的迴圈,還可以直接結束其外層迴圈。此時需要在break後緊跟一個標籤,用於標識一個外層迴圈。

Kotlin中的標籤就是一個緊跟著@的識別符號。Kotlin中的標籤只有放在迴圈語句之前才起作用。

//外層迴圈,用outer標識
[email protected] for (i in 0 until 5) {
    //內層迴圈
    for (j in 0 until 3) {
        println("i = ${i}, j = ${j}")
        if (j == 2) {
           [email protected]  //該break不是結束其所在的迴圈,而是結束outer所標識的迴圈
        }
    }
}

4.4.2 使用 continue 忽略本次迴圈剩下的語句

使用同break語句,不做贅述。

4.4.3 使用return結束方法

同Java,不做贅述。