Kotlin 的跳转表达式有三种:return、break、continue
return:默认从直接包围它的函数或者匿名函数返回
break:终止最直接包围它的循环
continue:继续下一次直接包围它的循环
在 Kotlin 中任何表达式都可以使用标签(label)来标记,使用方法为在代码块前加上标签符后跟 @ 符号,如 flag@、abc@ 等等,标签符由自己决定,使用方法如下:
flag@for (i in 1..10){}
break 和 continue 可以和标记的标签一起使用,其结果与 break 和 continue 的原生结果一致,不过只是使用标签来指定 break 和 continue 作用的循环。break 是跳转到该标签指定循环的后续执行点,而 continue 是继续执行指定循环的下一次迭代,我们通过一个例子来说明:
fun main(args: Array<String>) {
println("break 和标签一起使用:")
flag1@for (i in 1..10){
for (j in 1..10){
if (true){
println("$i + $j")
break@flag1
}
}
}
println("continue 和标签一起使用的:")
flag2@for (i in 1..10){
for (j in 1..10){
if (true){
println("$i + $j")
continue@flag2
}
}
}
}
结果:
这个例子就能和直观体现它们的区别:break 从标签 flag1 跳出,执行 flag1 循环的后面的代码,而 continue 则执行 flag2 后面的循环的接下来的迭代。
return 的简单使用:
fun main(args: Array<String>) {
answer()
}
fun answer() {
// 数组的迭代器有一个 Iterable.forEach() 方法,里面传入了一个参数 it,为数组中的参数,我们能进行操作
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return
print(it)
}
}
结果:
可以看到当 it==3 时,return 让整个函数直接跳出了,所以只输出了 12
那如果我们不从外层函数返回,从 lambda 表达式中返回呢?这里有两种方法:
fun main(args: Array<String>) {
answer1()
println()
answer2()
println()
answer3()
}
// 第一种:标签和 return 一起使用
fun answer1() {
listOf(1, 2, 3, 4, 5).forEach flag@{
if (it == 3) return@flag
print(it)
}
}
// 第二种:使用隐式标签,该标签与接受该 lambda 的函数相同
fun answer2() {
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return@forEach
print(it)
}
}
// 第三种:使用匿名函数代替 lambda,返回是从匿名函数返回,不是从外层函数返回
fun answer3() {
listOf(1, 2, 3, 4, 5).forEach (fun(value:Int){
if (value == 3) return
print(value)
})
}
结果:
这里可以看到,return 只从 lambda 表达式中或者匿名函数返回了,并未从外部函数返回,继续执行输出了 45 。