流程控制:返回和跳转

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

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

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

  2. break:终止循环;

  3. 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 标记的函数处


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章