1. 程式人生 > >Kotlin 控制流語句

Kotlin 控制流語句

在kotlin中我們可以使用if、when、for、while這幾種控制流語句。與java不同的是,kotlin取消了傳統的switch語句而改用when語句來實現。

if表示式

語法格式:

if (used by atomicExpression)
  : "if" "(" expression ")" controlStructureBody SEMI? ("else" controlStructureBody)?
  ;

首先我們看下傳統用法:

    var number = 20;
    if (number > 15) {
        print("The number is more than 15")
    }

我們同樣可以使用if…else if …else這樣在其他語言中存在的習慣用法:

   var number = 15;
    if (number > 20) {
        print("The number is more than 20")
    } else if (number == 20) {
        print("The number is equals")
    } else {
        print("The number is less than 20")
    }

如果你的條件分支超過3條,那麼kotlin會建議你採用when這種更加簡潔的方式:
在這裡插入圖片描述

接下來我們看一下在kotlin中if作為表示式的使用:

    var stuNumber = 55;
    var stu = if (stuNumber > 50) 50 else stuNumber
    print(stu)

輸出:

50

在這裡,if作為一個表示式(例如:返回它的值或者把它賦給變數),也就是意味著它可以返回一個值,在這種情況下,else分支是必須的。如果上面的例子沒有else分支,那麼你會得到如下的錯誤提示:
在這裡插入圖片描述

同樣的,作為表示式使用的時候,if的分支可以是程式碼塊,最後的表示式作為該塊的值:

    var stuNumber = 15;
    var maxStu = if (stuNumber > 50) {
        print("The students max number is 50")
        50
    }else{
        print("The students  number is $stuNumber")
        stuNumber
    }
    print("\n")
    print(maxStu)

輸出:

The students  number is 15
15

如果我們試著在if和else分支塊的末尾加一句程式碼:

var maxStu = if (stuNumber > 50) {
        ...
        true
    }else{
        ...
        false
    }

結果輸出:

false

所以有一點大家的記清楚了,if作為表示式:最後的表示式作為該塊的值。

When 表示式

when表示式的語法在kotlin的文件中我們也可以找到:

when (used by atomicExpression)
  : "when" ("(" expression ")")? "{"
        whenEntry*
    "}"
  ;
whenEntry (used by when)
  : whenCondition{","} "->" controlStructureBody SEMI
  : "else" "->" controlStructureBody SEMI
  ;
whenCondition (used by whenEntry)
  : expression
  : ("in" | "!in") expression
  : ("is" | "!is") type
  ;

最簡單的使用就和我們以前知道的switch是一樣的:

 var index = 1
    when (index) {
        1 -> {
            print("index is 1")
        }
        2 -> {
            print("index is 2")
        }
        else -> {
            print("index is 1")
        }
    }

其中如果是簡單的程式碼塊我們也可以使用kotlin官方示例的寫法,不用花括號進行程式碼塊的標識,當然了額,個人意見,使用{}將分支的程式碼包裹起來,可以讓我們更容易區分程式碼結構。

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

when 將它的引數與所有的分支條件順序比較,直到某個分支滿足條件。如果 when 作為一個表示式使用,則必須有 else 分支, 除非編譯器能夠檢測出所有的可能情況都已經覆蓋了[例如,對於 列舉(enum)類條目與密封(sealed)類子型別]。

也就是說任何情況下我們提供一個else分支是沒有任何壞處的,這就相當於switch的default分支。

記得swicth如果有多分支需要用相同的方式處理,一般的寫法應該是:

case 1:
case 2:
break;

這樣的形式,在kotlin中是將多個分支條件放在一起,用逗號分隔:

 1, 2, 3, 4 -> {
            print("index is $index")
        }

我們也可以檢測一個值在(in)或者不在(!in)一個區間或者集合中:

    var index = 4
    when (index) {
        in 1..3 -> {
            print("index is less than 3")
        }
        !in 1..3 -> {
            print("index is more than 3")
        }
    }

還有一種就是檢測一個值是(is)或者不是(!is)一個特定型別的值:

    var a: Any = "100"
    when (a) {
        is Char -> print("char")
        !is Number -> print("not number")
        else -> print("unknow")
    }

這裡提示大家一個小技巧,如果我們使用when表示式的時候,不能確定傳入的引數a的型別,此時我們在宣告變數的時候就將其宣告為Any型別:

 var a: Any = "100"

如果我們不指定型別:
在這裡插入圖片描述

程式無法通過編譯,提示我們衝突的型別。

另外就是和if一樣作為表示式的用法了:

var results = when (a) {
        is Char -> "char"
        !is Number -> "not number"
        else -> "unknow"
    }

如果它被當做表示式, 符合條件的分支的值就是整個表示式的值,這一點大家在使用的時候的自己注意。

迴圈語句
常見的for、while、do…while語法和我們以前接觸的大同小異:

for (used by loop)
  : "for" "(" annotations (multipleVariableDeclarations | variableDeclarationEntry) "in" expression ")" controlStructureBody
  ;
while (used by loop)
  : "while" "(" expression ")" controlStructureBody
  ;
doWhile (used by loop)
  : "do" controlStructureBody "while" "(" expression ")"
  ;

for 迴圈
for 可以迴圈遍歷任何提供了迭代器的物件,這相當於像 C# 這樣的語言中的 foreach 迴圈.

var array: Array<Int> = Array(5) { i -> i + 1 }
    for (value in array){
        print(value)
    }

對於某些特殊場景比如我們需要索引的時候,我們可以通過下面兩種方式獲得索引值:

 for (value in array.indices){
        print(value)
    }

如果我們列印一下array.indices的值大家就會發現 ,它返回的其實是陣列的索引範圍:

0..4

通過這種變相的方式為我們提供了元素的索引值。另外一種方式是:

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

在這裡插入圖片描述

for的另一種使用場景就是區間迭代:

for (i in 1..3) {
    println(i)
}

這和我們使用array.indices的原理是一致的。

while語句的使用我們就簡單的使用官方文件內容:

while (x > 0) {
    x--
}

do {
  val y = retrieveData()
} while (y != null) // y 在此處可見