Kotlin學習之-4.3.4 返回和中止循環
Kotlin 有3中結構化的跳轉語句:
- return,默認是從最近的函數或者匿名函數中中返回。
- break,中止最近的循環
- continue,從當前的循環中繼續執行下一次循環
所有這些表達式都可以被用來組成更大的表達式
val s = person.name ?: return
基於標籤的break 和continue
Kotlin中的任何表達式都可以被 標記成一個標籤label
,標籤由一個標識符和緊跟的@
組成,例如: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
語句,會把執行點跳轉到標籤標記的位置之後。 一個帶標籤continue
語句,會還執行循環的下一輪遍歷。
在標籤位置返回
Kotlin支持的函數語法可以讓本地函數,對象表達式和函數可以內嵌在一起。帶有標籤的return
語句可以讓我們從一個外層的函數中返回。 最終要的用例就是從一個lambda表達式中返回。例如:
fun foo() {
ints.forEach {
if (it == 0) return
print(it)
}
}
這個return
語句會從最近的函數中返回,也就是會從foo()
函數中返回。(注意這種非局部的返回只是在lambda表達式中支持傳遞給內聯函數)。如果我們需要從一個lambda表達式中返回,我們只能先標記它,然後使用帶標籤的返回語句。
fun foo() {
ints.forEach lit@ {
if (it == 0) reutrn@lit
print(it)
}
}
現在它只是從lambda表達式中返回。還有時候,使用隱式標籤會更加方便:隱式標籤的名字和調用這個lambda表達式的函數名是一樣的。
fun foo() {
val intArray2 = intArrayOf(1, 2, 3)
// will print 13 skip 2
intArray2.forEach {
if (it == 2) return@forEach
print(it)
}
}
或者還可以把lambda表達式替換成給一個匿名函數。一個返回語句在一個匿名函數中會從匿名函數中返回。
fun foo() {
ints.forEach(fun(value: Int) {
if (value == 0) return
print(value)
})
}
如果需要返回值,解析器需要一個參數,例如:
return@a 1
意味着在@a這個位置返回1, 而不是返回一個標籤表達式(@a 1)