返回和跳轉(zhuǎn)
????????Kotlin有三種結(jié)構(gòu)化跳轉(zhuǎn)表達(dá)式
- return乾忱。默認(rèn)從最直接包圍它的函數(shù)或者匿名函數(shù)返回屉更。
- break。終止最直接包圍它的循環(huán)漩氨。
- continue西壮。繼續(xù)下一次最直接包圍它的循環(huán)。
????????作為表達(dá)式叫惊,可以嵌套到更大的表達(dá)式之中:
val s = person.name ?: return
????????這些表達(dá)式的類型是 Nothing 類型款青。
(除了具有類型外,看著和Java中的沒什么不同)
break霍狰、continue與標(biāo)簽
Kotlin 中任何表達(dá)式都可以用標(biāo)簽(label)來(lái)標(biāo)記抡草。 標(biāo)簽的格式為標(biāo)識(shí)符后跟 @ 符號(hào)。要為一個(gè)表達(dá)式加標(biāo)簽蔗坯,我們只要在其前加標(biāo)簽即可康震。如下,標(biāo)簽限制的 break 跳轉(zhuǎn)到剛好位于該標(biāo)簽指定的循環(huán)后面的執(zhí)行點(diǎn)宾濒。 continue 繼續(xù)標(biāo)簽指定的循環(huán)的下一次迭代腿短。
loop@ for (i in 1..100) {
for (j in 1..100) {
if (j%11==0) break@loop
if (j%2==0) continue@loop
}
}
????????如上所示break和continue指定的都是loop@標(biāo)記的外部循環(huán)
(直接標(biāo)記表達(dá)式顯然更清晰些)
return與標(biāo)簽
????????Kotlin 有函數(shù)字面量、局部函數(shù)和對(duì)象表達(dá)式。因此 Kotlin 的函數(shù)可以被嵌套橘忱。 標(biāo)簽限制的 return 允許我們從外層函數(shù)返回赴魁。 最重要的一個(gè)用途就是從 lambda 表達(dá)式中返回。
//非局部直接返回到 foo() 的調(diào)用者
//注意钝诚,這種非局部的返回只支持傳給內(nèi)聯(lián)函數(shù)的 lambda 表達(dá)式颖御。)
fun foo() {
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return
print(it)
}
println("this point is unreachable")
}
//return 12
//為了局部返回到該 lambda 表達(dá)式的調(diào)用者,即 forEach 循環(huán)凝颇,我們必須給它加標(biāo)簽并用以限制 return
fun foo() {
listOf(1, 2, 3, 4, 5).forEach lit@{
if (it == 3) return@lit
print(it)
}
print(" done with explicit label")
}
//return 1245 done with explicit label
//通常情況下使用隱式標(biāo)簽更方便潘拱。 該標(biāo)簽與接受該 lambda 的函數(shù)同名。
fun foo() {
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return@forEach // 局部返回到該 lambda 表達(dá)式的調(diào)用者拧略,即 forEach 循環(huán)
print(it)
}
print(" done with implicit label")
}
//return 1245 done with implicit label
//當(dāng)使用匿名函數(shù)替代lambda表達(dá)式時(shí)芦岂,內(nèi)部的return語(yǔ)句將從該匿名函數(shù)自身返回
fun foo() {
listOf(1, 2, 3, 4, 5).forEach(fun(value: Int) {
if (value == 3) return // 局部返回到匿名函數(shù)的調(diào)用者,即 forEach 循環(huán)
print(value)
})
print(" done with anonymous function")
}
//return 1245 done with anonymous function
//前文實(shí)現(xiàn)的局部返回類似在常規(guī)循環(huán)中使用continue垫蛆,要實(shí)現(xiàn)類似break效果盔腔,可以通過(guò)增加另一層嵌套 lambda 表達(dá)式并從其中非局部返回來(lái)模擬
fun foo() {
run loop@{
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return@loop // 從傳入 run 的 lambda 表達(dá)式非局部返回
print(it)
}
}
print(" done with nested loop")
}
//return 12 done with nested loop
//當(dāng)標(biāo)簽標(biāo)記的表達(dá)式需要返回值時(shí),將返回值卸載標(biāo)簽限制的return后面
fun foo() {
val s = loop@{
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return@loop "測(cè)試返回值1"
print(it)
}
"測(cè)試返回值2"
}
print(s())
}
//return 12測(cè)試返回值1
(只能說(shuō)標(biāo)簽還是那個(gè)標(biāo)簽月褥,用途看著和循環(huán)類似,騷的是函數(shù)嵌套)