和 Java 相同,Kotlin 中有三个用来跳转的关键字:return、break 和 continue。java
它们的基本用法与 Java 一致:数组
return:返回函数的值或终止函数函数运行;app
break:终止循环;ide
continue:跳转到下一次循环。函数
与 Java 相同,它们跳转的对象都是最直接包围它们的函数或循环。oop
咱们重点看一下 Kotlin 中强化版的 标签:this
Kotlin 中的标签能够用在任何表达式前,格式以下:spa
标签名@ 表达式 //标签名为合法的标识符,与变量名和函数名格式相同
在循环中使用标签,能够指定跳转的位置:orm
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 标记的函数处