和 Java 相同,Kotlin 中有三个用来跳转的关键字:return、break 和 continue。
它们的基本用法与 Java 一致:
return:返回函数的值或终止函数函数运行;
break:终止循环;
continue:跳转到下一次循环。
与 Java 相同,它们跳转的对象都是最直接包围它们的函数或循环。
我们重点看一下 Kotlin 中强化版的 标签:
Kotlin 中的标签可以用在任何表达式前,格式如下:
标签名@ 表达式 //标签名为合法的标识符,与变量名和函数名格式相同
在循环中使用标签,可以指定跳转的位置:
loop@ for (i in 1..10) { for (j in 1..10) { if(...) break@loop //终止 i 循环 }}
如果我们不使用 loop 标签,break 将会终止 j 的循环;
这里 Kotlin 中的标签还只是与 Java 中的标签一样,起到控制流程的作用,但 Kotlin 标签的强大之处在于它还可以控制 return 的返回对象。
首先看一个例子:
fun main(args: Array<String>){ val ints = intArrayOf(1, 2, 3) ints.forEach { if (it == 2) return println(it) }}
它的输出结果是 1。
首先解释一下 forEach() 这个函数,它是 _Arrays.kt 文件中定义的扩展函数,所有数组都扩展了这个函数:
public inline fun <T> Array<out T>.forEach(action: (T) -> Unit): Unit { for (element in this) action(element)}
可以看到,它接收一个没有返回值的函数,并使用 for 循环遍历数组中的每个元素,对每个元素执行传入函数的操作。
上面的例子里,我们使用 forEach() 函数遍历 ints 数组中的元素,对于每个元素,我们检查它是否等于 2,如果等于 2 则跳过,不等于 2 则打印这个元素。
但是 return 只会跳出一个显式定义的函数,不会跳出 lambda 表达式,所以这里的 return 会直接跳出 main() 函数,结束进程,后面的 3 没有遍历到。
如果我们想跳出 lambda 表达式,可以用标签标记这个 lambda 表达式,然后让 return 返回到这个标签处:
ints.forEach lit@{ if(it == 2) return@lit println(it)}
这样,程序运行到 it = 2 时,会直接返回到 lit 标签标记的函数开始处,继续下一次遍历,输出 1 和 3 。
Kotlin 为了简化程序,会给每个高阶函数添加一个 隐式标签,这个标签与函数同名,上面的程序可以写为:
ints.forEach { if(it == 2) return@forEach println(it)}
此外,如果 return 后有返回值,再加标签就要写成 return@标签 返回值 的形式:
return@loop 1 // 返回值 1 到 loop 标记的函数处