Kotlin有三个结构跳转表达式:
-
return
- 默认情况下,从最近的封闭函数或匿名函数返回。
-
break
- 终止最近的闭合循环。
-
continue
- 前进到最近的封闭循环的下一个步骤(迭代)。
所有这些表达式都可以用作更大表达式的一部分:
val s = person.name ?: return
|
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)
|
})
|
}
|
当返回值时,解析器优先考虑标签的返回值,即 -
表示“在标签
@a
处返回
1
”,而不是“返回标记的表达式
(@a 1)
”。