Kotlin返回和跳轉
Kotlin有三個結構跳轉表達式:
-
return
- 默認情況下,從最近的封閉函數或匿名函數返回。 -
break
- 終止最近的閉合循環。 -
continue
- 前進到最近的封閉循環的下一個步驟(迭代)。
所有這些表達式都可以用作更大表達式的一部分:
val s = person.name ?: return
這些表達式的類型是Nothing類型。
Break 和 Continue 標籤
Kotlin中的任何表達式都可以標記一個標籤。標籤具有標識符的形式,它的後面跟@
符號,例如: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
爲標記跳轉到執行點後。標記繼續進行到該循環的下一次迭代。
在標籤上返回
使用函數文字,局部函數和對象表達式,函數可以嵌套在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)
」。