和 Java 相同,Kotlin 中有三個用來跳轉的關鍵字:return、break 和 continue。
它們的基本用法與 Java 一致:
return:返回函數的值或終止函數函數運行;
break:終止循環;
continue:跳轉到下一次循環。
與 Java 相同,它們跳轉的對象都是最直接包圍它們的函數或循環。
我們重點看一下 Kotlin 中強化版的 標籤:
Kotlin 中的標籤可以用在任何表達式前,格式如下:
標籤名@ 表達式 //標籤名爲合法的標識符,與變量名和函數名格式相同
在循環中使用標籤,可以指定跳轉的位置:
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 標記的函數處