Kotlin返回和跳轉

Kotlin有三個結構跳轉表達式:

  • return - 默認情況下,從最近的封閉函數或匿名函數返回。
  • break - 終止最近的閉合循環。
  • continue - 前進到最近的封閉循環的下一個步驟(迭代)。

所有這些表達式都可以用作更大表達式的一部分:

val s = person.name ?: return

這些表達式的類型是Nothing類型。

Break 和 Continue 標籤

Kotlin中的任何表達式都可以標記一個標籤。標籤具有標識符的形式,它的後面跟@符號,例如:abc@fooBar@是有效標籤(請參閱語法)。 要使用標註表達式,只是在其前面放上一個標籤。

loop@ for (i in 1..100) {
    // ...
}

現在,可以標記breakcontinue標籤:

loop@ for (i in 1..100) {
    for (j in 1..100) {
        if (...) break@loop
    }
}

標記 break 爲標記跳轉到執行點後。標記繼續進行到該循環的下一次迭代。

在標籤上返回

使用函數文字,局部函數和對象表達式,函數可以嵌套在Kotlin中。 修飾return允許從外部函數返回。 最重要的用例是從lambda表達式返回。如下代碼示例 -

fun foo() {
    ints.forEach {
        if (it == 0) return
        print(it)
    }
}

返回表達式從最近的包圍函數返回,即foo。 (請注意,這種非局部返回僅適用於傳遞給內聯函數的lambda表達式),如果需要從lambda表達式返回,必須對它進行標註並限定返回值:

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表達式。異常函數中的返回語句將從匿名函數中返回。

fun foo() {
    ints.forEach(fun(value: Int) {
        if (value == 0) return
        print(value)
    })
}

當返回值時,解析器優先考慮標籤的返回值,即 -

return@a 1

表示「在標籤[@a](https://github.com/a "@a")處返回1」,而不是「返回標記的表達式([@a](https://github.com/a "@a") 1)」。