天天看點

Kotlin 從學習到 Android 第四章 控制流

if 表達式

在 Kotlin 中,if 是表達式語句,它可以傳回一個值,是以在 Kotlin 中沒有三目運算符(condition ? then : else)。

// 傳統的 if 用法
var max = a 
if (a < b) max = b

// 傳統的 if 和 else 用法 
var max: Int
if (a > b) {
    max = a
} else {
    max = b
}

// 在 Kotlin 中作為表達式的用法
val max = if (a > b) a else b
           

if 表達式的分支也可以是代碼塊,其最後一個表達式是這個分支代碼塊的傳回值。

var a = 3
var b = 5
val max = if (a > b) {
    print("Choose a ")
    a
} else {
    print("Choose b ")
    b
}
println(max)        // 5
val min = if (a < b){
    a
    print("Choose a")
} else {
    b
    print("Choose b")
}
println(min)        // kotlin.Unit
           

注意:如果你用 if 作為一個表達式使用而不是作為條件語句,那麼 if 表達式必須有 else 分支。

when 表達式

when 表達式取代 switch 操作,它的一般形式為:

when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> { // 注意這裡的 else
        print("x is neither 1 nor 2")
    }
}
           

when 按順序逐個比對每一個邏輯分支,知道成功比對。when 既可以用作表達式也可以用作條件語句。當 when 用作表達式時,那個成功比對的分支的值就是整個 when 表達式的值;當 when 作為條件語句時,分支的值将被自動忽略。(和 if 一樣,when 的分支也可以是代碼塊,其最後一個表達式是這個分支代碼塊的傳回值。)

當所有分支的條件都不符合時,when 就會比對 else 分支。如果 when 作為一個表達式使用時,必須含有 else 分支,除非 編譯器 能驗證其它分支能夠完全覆寫所有可能出現的比對條件,即除 else 分支外必有一個分支被成功比對,此時可以省略 else 分支,實際上編譯器不會驗證,如下面代碼在 intellij 中仍然編譯不通過,雖然确定不會走 else 分支,但必須有 else 。

val a = 1
var b: Int
b = when (a) {
    0 -> 0
    1 -> 1
    2 -> 2
    3 -> 3
    // else -> 3000
}
println(b)
           

如果很多條件的處理方式一樣,那麼這些條件可以寫在一起,用逗号分割即可:

when (x) {
    0, 1 -> print("x == 0 or x == 1")
    else -> print("otherwise")
}
           

不僅常量可以做為分支條件,表達式也可以作為分支條件:

when (x) {
    parseInt(s) -> print("s encodes x")
    else -> print("s does not encode x")
}
           

分支的條件也可以用 in 或者集合修飾:

when (x) {
    in 1..10 -> print("x is in the range")
    in validNumbers -> print("x is valid")
    !in 10..20 -> print("x is outside the range")
    else -> print("none of the above")
}
           

當然你也可以使用 is 修飾,并且在成功比對的分支中不需要強制轉型就可以使用條件上判斷好的類型的方法。

fun hasPrefix(x: Any) = when(x) {
    is String -> x.startsWith("prefix") // 驗證通過則說明 x 是 String 類型,不需要再強制轉型就可以使用 String 的方法
    else -> false
}
           

另外,when 也可以代替 if-else if 關系鍊,如果不傳入判斷參數,分支條件僅是 Boolean 類型,當條件為 true 時,就會執行這個分支的代碼塊。

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

for 循環

for 循環的常用方式:

for (item in collection) print(item)
           

for (item: Int in ints) {
    // ...
}
           

在 for 循環中,系統會自動建立一個 iterator ,它提供了如下方法:

  • iterator()
  • next()
  • hasNext(),傳回一個Boolean 值

如果 for 循環是通過下标建立的,那麼系統不會建立 iterator ,這樣性能比較高。

for (i in array.indices) {
    print(array[i])
}
           

當然,你也可以這麼寫:

for ((index, value) in array.withIndex()) {
    println("the element at $index is $value")
}
           

while 循環

while 和 do..while 與一般的使用方式一樣。

while (x > 0) {
    x--
}

do {
    val y = retrieveData()
} while (y != null)