Kotlin:return与跳转
Kotlin有两种跳转:循环跳转(break与continue)和返回跳转(return)。
Label
label语法:
labelName@
label可以放在任何表达式之前,用来标记表达式。如
loop@ for (i in 1..100) {
// ...
}
break和continue
break和continue用于循环的跳转。
- break默认情况下跳出最近的循环语句。
- continue默认为跳出最近循环语句当前的一次迭代,继续执行下一次迭代。
break示例
for (i in 1..100) {
for (j in 1..100) {
if (...) break
}
}
break跳出了里面的for循环语句。
continue示例
for (i in 1..100) {
for (j in 1..100) {
if (...) continue
}
}
continue跳出里面for循环语句的当前迭代,继续执行里面for循环语句的下一次迭代。
默认情况下,break和continue是以最近的循环语句跳转。在多个内嵌循环里,可以使用label来跳转。
loop@ for (i in 1..100) {
for (j in 1..100) {
if (...) break@loop
}
}
与前面的break示例不同,此处break会跳出loop@标记的for循环。
return
return语句默认为跳出最近的函数。
fun foo() {
ints.forEach {
if (it == 0) return
print(it)
}
}
在此示例里,return会跳出foo函数,而不是跳出forEach里的lambda表达式。
如果需要在lambda表达式返回有两种方法
- 把lambda表达式改为匿名函数
- 结合label使用
匿名函数
fun foo() {
ints.forEach(fun(value: Int) {
if (value == 0) return
print(value)
})
}
这里return跳出的是匿名函数,因为最近的函数为在forEach里定义的匿名函数。
结合label使用
结合label使用,可以让return在lambda表达式返回。
fun foo() {
ints.forEach lit@ {
if (it == 0) return@lit
print(it)
}
}
此处在forEach里的lambda表达式返回。更简单的方法是使用调用lambda表达式的函数作为标签,如forEach
上面的例子等同于
fun foo() {
ints.forEach {
if (it == 0) return@forEach
print(it)
}
}
return除了跳出指定的label外,也可以在跳出处返回一个值。
return@a 1
这里的return表示在@a处返回1.