流程控制:返回和跳转

和 Java 相同,Kotlin 中有三个用来跳转的关键字:returnbreak 和 continuejava

它们的基本用法与 Java 一致:数组

  1. return:返回函数的值或终止函数函数运行;app

  2. break:终止循环;ide

  3. 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 标记的函数处
相关文章
相关标签/搜索