Kotlin 循環控制

For 循環

for 循環能夠對任何提供迭代器(iterator)的對象進行遍歷,語法以下:數組

for (item in collection) print(item)

循環體能夠是一個代碼塊:app

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

如上所述,for 能夠循環遍歷任何提供了迭代器的對象。函數

若是你想要經過索引遍歷一個數組或者一個 list,你能夠這麼作:oop

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

注意這種"在區間上遍歷"會編譯成優化的實現而不會建立額外對象。優化

或者你能夠用庫函數 withIndex:spa

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是最基本的循環,它的結構爲:element

while( 布爾表達式 ) { //循環內容 }

do…while 循環 對於 while 語句而言,若是不知足條件,則不能進入循環。但有時候咱們須要即便不知足條件,也至少執行一次。it

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)"。

相關文章
相關標籤/搜索