和 Java 相同,Kotlin 中有三個用來跳轉的關鍵字:return、break 和 continue。java
它們的基本用法與 Java 一致:數組
return:返回函數的值或終止函數函數運行;app
break:終止循環;ide
continue:跳轉到下一次循環。函數
與 Java 相同,它們跳轉的對象都是最直接包圍它們的函數或循環。oop
咱們重點看一下 Kotlin 中強化版的 標籤:this
Kotlin 中的標籤能夠用在任何表達式前,格式以下:spa
標籤名@ 表達式 //標籤名爲合法的標識符,與變量名和函數名格式相同
在循環中使用標籤,能夠指定跳轉的位置:orm
loop@ for (i in 1..10) { for (j in 1..10) { if(...) break@loop //終止 i 循環 }}
若是咱們不使用 loop 標籤,break 將會終止 j 的循環;對象
這裏 Kotlin 中的標籤還只是與 Java 中的標籤同樣,起到控制流程的做用,但 Kotlin 標籤的強大之處在於它還能夠控制 return 的返回對象。
首先看一個例子:
fun main(args: Array<String>){ val ints = intArrayOf(1, 2, 3) ints.forEach { if (it == 2) return println(it) }}
它的輸出結果是 1。
首先解釋一下 forEach() 這個函數,它是 _Arrays.kt 文件中定義的擴展函數,全部數組都擴展了這個函數:
public inline fun <T> Array<out T>.forEach(action: (T) -> Unit): Unit { for (element in this) action(element)}
能夠看到,它接收一個沒有返回值的函數,並使用 for 循環遍歷數組中的每一個元素,對每一個元素執行傳入函數的操做。
上面的例子裏,咱們使用 forEach() 函數遍歷 ints 數組中的元素,對於每一個元素,咱們檢查它是否等於 2,若是等於 2 則跳過,不等於 2 則打印這個元素。
可是 return 只會跳出一個顯式定義的函數,不會跳出 lambda 表達式,因此這裏的 return 會直接跳出 main() 函數,結束進程,後面的 3 沒有遍歷到。
若是咱們想跳出 lambda 表達式,能夠用標籤標記這個 lambda 表達式,而後讓 return 返回到這個標籤處:
ints.forEach lit@{ if(it == 2) return@lit println(it)}
這樣,程序運行到 it = 2 時,會直接返回到 lit 標籤標記的函數開始處,繼續下一次遍歷,輸出 1 和 3 。
Kotlin 爲了簡化程序,會給每一個高階函數添加一個 隱式標籤,這個標籤與函數同名,上面的程序能夠寫爲:
ints.forEach { if(it == 2) return@forEach println(it)}
此外,若是 return 後有返回值,再加標籤就要寫成 return@標籤 返回值 的形式:
return@loop 1 // 返回值 1 到 loop 標記的函數處