在 Kotlin 中和 Java 中一样有三种结构化跳转表达式:
- return。默认从最直接包围它的函数或者匿名函数返回。
- break。终止最直接包围它的循环。
- continue。继续下一次最直接包围它的循环。
从上面的表述我们了解和 Java 中没有什么区别,在此就不多作描述,但是在 Kotlin 中他们有一个叫做 标签 的概念。
1、标签
Kotlin 中 任意表达式 都可以使用标签来标记。标签的格式为标识符后跟 @
符号,例如:abc@
。
为表达式加标签:
loop@ for (i in 1..100) {
// ……
}
2、Break 与 Continue 标签 – 标签处跳转
我们可以用标签限制 break
或者 continue
,标签限制的 break
跳转到刚好位于该标签指定的循环后面的执行点。 continue
继续标签指定的循环的下一次迭代。但是很明显的是 我们可以通过标签改变 break
和 continue
原本的跳转逻辑,见下例:
for (i in 1..10) {
loop@for (j in 1..10)
if (i * j > 50) {
println("i is $i, j is $j")
break@loop
}
}
此时,break 就失去了其原本的跳转逻辑 – 终止最直接包围它的循环
, 而是调整到标签处继续执行逻辑, 日志打印信息如下:
i is 6, j is 9
i is 7, j is 8
i is 8, j is 7
i is 9, j is 6
i is 10, j is 6
同理。标签也可以更改 continue 原本的跳转逻辑,
loop@for (i in 1..10) {
for (j in 1..10)
if (i * j > 50) {
println("i is $i, j is $j")
continue@loop
}
}
3、标签处返回
标签处返回的含义和标签处的跳转的表示意义差不多,即摒弃原来的返回逻辑,返回至标签处去执行业务逻辑。
private val list = listOf<String>("t3e","ifefef","45")
fun foo() {
list.forEach {
println(it)
it.forEach lit@{
if (it.toString() == "i") return@lit
println(it)
}
}
}
打印日志为:
t3e
t
3
e
ifefef
f
e
f
e
f
45
4
5
很明显,return
并没有按照原有逻辑进行返回,而按照标签仅仅在 “i”
时没有执行 println(it)
操作。