流程控制:返回和跳轉

和 Java 相同,Kotlin 中有三個用來跳轉的關鍵字:returnbreak 和 continue

它們的基本用法與 Java 一致:

  1. return:返回函數的值或終止函數函數運行;

  2. break:終止循環;

  3. 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 標記的函數處


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章