Kotlin有三個(gè)結(jié)構(gòu)跳轉(zhuǎn)表達(dá)式:
return - 默認(rèn)情況下,從最近的封閉函數(shù)或匿名函數(shù)返回。break - 終止最近的閉合循環(huán)。continue - 前進(jìn)到最近的封閉循環(huán)的下一個(gè)步驟(迭代)。所有這些表達(dá)式都可以用作更大表達(dá)式的一部分:
val s = person.name ?: return
這些表達(dá)式的類型是Nothing類型。
Kotlin中的任何表達(dá)式都可以標(biāo)記一個(gè)標(biāo)簽。標(biāo)簽具有標(biāo)識(shí)符的形式,它的后面跟@符號(hào),例如:abc@,fooBar@是有效標(biāo)簽(請(qǐng)參閱語(yǔ)法)。 要使用標(biāo)注表達(dá)式,只是在其前面放上一個(gè)標(biāo)簽。
loop@ for (i in 1..100) {
// ...
}
現(xiàn)在,可以標(biāo)記break或continue標(biāo)簽:
loop@ for (i in 1..100) {
for (j in 1..100) {
if (...) break@loop
}
}
標(biāo)記 break 為標(biāo)記跳轉(zhuǎn)到執(zhí)行點(diǎn)后。標(biāo)記繼續(xù)進(jìn)行到該循環(huán)的下一次迭代。
使用函數(shù)文字,局部函數(shù)和對(duì)象表達(dá)式,函數(shù)可以嵌套在Kotlin中。 修飾return允許從外部函數(shù)返回。 最重要的用例是從lambda表達(dá)式返回。如下代碼示例 -
fun foo() {
ints.forEach {
if (it == 0) return
print(it)
}
}
返回表達(dá)式從最近的包圍函數(shù)返回,即foo。 (請(qǐng)注意,這種非局部返回僅適用于傳遞給內(nèi)聯(lián)函數(shù)的lambda表達(dá)式),如果需要從lambda表達(dá)式返回,必須對(duì)它進(jìn)行標(biāo)注并限定返回值:
fun foo() {
ints.forEach lit@ {
if (it == 0) return@lit
print(it)
}
}
現(xiàn)在,它只從lambda表達(dá)式返回。通常使用隱性標(biāo)簽更為方便:這樣的標(biāo)簽與傳遞lambda的函數(shù)具有相同的名稱。
fun foo() {
ints.forEach {
if (it == 0) return@forEach
print(it)
}
}
或者,可以用匿名函數(shù)替換lambda表達(dá)式。異常函數(shù)中的返回語(yǔ)句將從匿名函數(shù)中返回。
fun foo() {
ints.forEach(fun(value: Int) {
if (value == 0) return
print(value)
})
}
當(dāng)返回值時(shí),解析器優(yōu)先考慮標(biāo)簽的返回值,即 -
return@a 1
表示“在標(biāo)簽@a處返回1”,而不是“返回標(biāo)記的表達(dá)式(@a 1)”。