1. 程式人生 > >kotlin(2):控制流

kotlin(2):控制流

控制流

1.if表示式

If可以返回一個值

使用:

val v = if(3>4) 5 else 1

    If的分支可以使程式碼塊,最後的表示式作為該塊的值,如果使用if作為表示式而不是語句,該表示式需要有else分支

2.when表示式

When取代了switch,不會順序執行,when將引數和所有的分支條件順序比較,直到某個分支滿足條件,when既可以被當做表示式使用也可以當做語句使用,如果被當做表示式,符號條件的分支的值就是整個表示式的值,如果當做語句使用,則忽略個別分支的值(if一樣,每一個分支可以是一個程式碼塊

,它的值是塊中最後的表示式的值)

 如果其他分支都不滿足條件就會求值else分支,如果when作為一個表示式使用,則必須有else分支,除非編譯器能夠檢測出所有的可能情況都已經覆蓋了.

如果很多分支需要用相同的方式處理,則可以把多個分支條件放在一起,用逗號分隔

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或者不在!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 !is一個特定型別的值,由於智慧轉換,可以訪問該型別的方法和屬性而無需任何額外的檢測

fun hasPrefix(x: Any) = when(x) {
 is String -> x.startsWith("prefix")
 else -> false
}


When也可以取代if-else if 如果不提供引數,所有的分支條件都是簡單的布林表示式,當順序執行的一個分支的條件為真的時候就執行該分支

val age = 16
when {
    true -> {print("age == 3")}//執行 並終止
    true -> {print("age == 2")}
    else -> {
        print("age is neither 3 nor 2")
    }
}
 


 

3.for迴圈

for迴圈可以對任何提供迭代器(iterator)的物件進行遍歷

for(item in collection) print(item)


具有迭代器的物件需要的條件:

A.有一個成員函式或者擴充套件函式iterator()

B.有一個成員函式或者擴充套件函式next()

C.有一個成員函式或者擴充套件函式hasNext() 返回boolean

這三個函式都需要標記為operator

 

對陣列的for迴圈會被編譯為並不建立迭代器的基於索引的迴圈

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


或者可以用庫函式withIndex:

for((index,value) in array.withIndex()) {
 Print(“$index is $value”)
}


4.while迴圈

java一樣

5.跳轉

kotlin中任何表示式都可以用標籤來標記,標籤的格式為識別符號後跟@符號,例如:[email protected]

  

     [email protected]  for (i in 1..100) {
        [email protected] for(j in 1..100) {
           if(i == 50) [email protected]
        }
     }

 

Kotlin有函式字面量,區域性函式和物件表示式,因此kotlin的函式可以被巢狀,標籤限制的return允許我們從外層函式返回,最重要的一個用途就是從lambda表示式中返回

fun foo(){
    val arr = arrayOf(1,2,3)
    arr.forEach{
        print(it)
        if (it == 2) [email protected]//結束的是forEach  會執行print(“end”)
    }
    print("end")
}