Kotlin 迴圈控制
For 迴圈
for 迴圈可以對任何提供迭代器(iterator)的對象進行遍曆,語法如下:
for (item in collection) print(item)
循環體可以是一個代碼塊:
for (item: Int in ints) { // …… }
如上所述,for 可以迴圈遍歷任何提供了迭代器的對象。
如果你想要通過索引遍曆一個數組或者一個 list,你可以這麼做:
for (i in array.indices) { print(array[i]) }
注意這種"在區間上遍曆"會編譯成優化的實現而不會創建額外對象。
或者你可以用庫函數 withIndex:
for ((index, value) in array.withIndex()) { println("the element at $index is $value") }
實例
對集合進行迭代:
fun main(args: Array<String>) { val items = listOf("apple", "banana", "kiwi") for (item in items) { println(item) } for (index in items.indices) { println("item at $index is ${items[index]}") } }
輸出結果:
apple banana kiwi item at 0 is apple item at 1 is banana item at 2 is kiwi
while 與 do...while 迴圈
while是最基本的迴圈,它的結構為:
while( 布爾運算式 ) { //迴圈內容 }
do…while 迴圈 對於 while 語句而言,如果不滿足條件,則不能進入迴圈。但有時候我們需要即使不滿足條件,也至少執行一次。
do…while 迴圈和 while 迴圈相似,不同的是,do…while 迴圈至少會執行一次。
do { //代碼語句 }while(布爾運算式);
實例
fun main(args: Array<String>) { println("----while 使用-----") var x = 5 while (x > 0) { println( x--) } println("----do...while 使用-----") var y = 5 do { println(y--) } while(y>0) }
輸出結果:
5 4 3 2 1 ----do...while 使用----- 5 4 3 2 1
返回和跳轉
Kotlin 有三種結構化跳轉運算式:
- return。默認從最直接包圍它的函數或者匿名函數返回。
- break。終止最直接包圍它的迴圈。
- continue。繼續下一次最直接包圍它的迴圈。
在迴圈中 Kotlin 支持傳統的 break 和 continue 操作符。
fun main(args: Array<String>) { for (i in 1..10) { if (i==3) continue // i 為 3 時跳過當前迴圈,繼續下一次迴圈 println(i) if (i>5) break // i 為 6 時 跳出迴圈 } }
輸出結果:
1 2 4 5 6
Break 和 Continue 標籤
在 Kotlin 中任何運算式都可以用標籤(label)來標記。 標籤的格式為識別字後跟 @ 符號,例如:abc@、fooBar@都是有效的標籤。 要為一個運算式加標籤,我們只要在其前加標籤即可。
loop@ for (i in 1..100) { // …… }
現在,我們可以用標籤限制 break 或者continue:
loop@ for (i in 1..100) { for (j in 1..100) { if (……) break@loop } }
標籤限制的 break 跳轉到剛好位於該標籤指定的迴圈後面的執行點。 continue 繼續標籤指定的迴圈的下一次迭代。
標籤處返回
Kotlin 有函數字面量、局部函數和對象運算式。因此 Kotlin 的函數可以被嵌套。 標籤限制的 return 允許我們從外層函數返回。 最重要的一個用途就是從 lambda 運算式中返回。回想一下我們這麼寫的時候:
fun foo() { ints.forEach { if (it == 0) return print(it) } }
這個 return 運算式從最直接包圍它的函數即 foo 中返回。 (注意,這種非局部的返回只支持傳給內聯函數的 lambda 運算式。) 如果我們需要從 lambda 運算式中返回,我們必須給它加標籤並用以限制 return。
fun foo() { ints.forEach lit@ { if (it == 0) return@lit print(it) } }
現在,它只會從 lambda 運算式中返回。通常情況下使用隱式標籤更方便。 該標籤與接受該 lambda 的函數同名。
fun foo() { ints.forEach { if (it == 0) return@forEach print(it) } }
或者,我們用一個匿名函數替代 lambda 運算式。 匿名函數內部的 return 語句將從該匿名函數自身返回
fun foo() { ints.forEach(fun(value: Int) { if (value == 0) return print(value) }) }
當要返一個回值的時候,解析器優先選用標籤限制的 return,即
return@a 1
意為"從標籤 @a 返回 1",而不是"返回一個標籤標注的運算式 (@a 1)"。