本文已同步宣布于我的微信大众号,微信搜索 代码说 即可关注,欢迎与我沟通交流。

Kotlin 有三种结构化跳转表达式:

  • return:默许从最直接围住它的函数或者匿名函数回来。
  • break:停止最直接围住它的循环。
  • continue:持续下一次最直接围住它的循环。

for循环中运用break、continue

 for (i in 1..5) {
    if (i == 3) break //1 这里别离运用break continue return
    println("i: $i")
 }
 println("循环外持续履行")

1处别离运用break、continue、return 替换,履行成果如下:

//break 
i: 1
i: 2
循环外持续履行
//continue
i: 1
i: 2
i: 4
i: 5
循环外持续履行
//return
i: 1
i: 2

嗯,跟Java中的运用姿势是相同的,持续往下看。

Label标签

在 Kotlin 中任何表达式都能够用标签(label)来标记。 标签的格式为标识符后跟 @ 符号,例如:abc@、loop@都是有效的标签。 要为一个表达式加标签,咱们只需在其前加标签即可。示例:

loop@ for (i in 1..5){
 //...
}

这里在嵌套for循环中运用Label,能够操控break及continue的范围:

loop@ for (i in 1..2) {
    println("i: $i")
    for (j in 1..5) {
        if (j == 3) break@loop //break continue
        println("j: $j")
    }
}
println("循环外持续履行")

履行成果:

//break
i: 1
j: 1
j: 2
循环外持续履行
//continue
i: 1
j: 1
j: 2
i: 2
j: 1
j: 2
循环外持续履行

结论:Label标签限制的 break 跳转到刚好位于该标签指定的循环后边的履行点。 continue 持续标签指定的循环的下一次迭代

留意不能在上述代码中运用return@loop,因为目标标签表示的不是函数,过错信息如下:

Target label does not denote a function

forEach中模仿break、continue

在forEach中并不能直接运用break、continue:

Kotlin | 在for、forEach循环中正确的使用break、continue
能够看到直接报错了,过错信息也很清晰:break 和 continue 只允许在循环中运用,而这里是forEach的闭包,所以并不能直接运用break 和 continue。那么如何在forEach中别离模仿出break、continue的作用呢?通过Label即可实现,如:

fun forEachControl() {
    listOf(1, 2, 3, 4, 5).forEach forEach@{
        if (it == 3) return@forEach
        println("it:$it")
    }
    println("循环外持续履行")
}

return 只会从 lambda 表达式中回来。通常情况下运用隐式标签更便利(Label 标签与接受该 lambda 的函数同名即可运用隐式标签),简化之后:

fun forEachControl() {
    listOf(1, 2, 3, 4, 5).forEach{
        if (it == 3) return@forEach
        println("it:$it")
    }
    println("循环外持续履行")
}

代码履行成果:

it:1
it:2
it:4
it:5
循环外持续履行

能够看到return@forEach相当于表达式里面的continue了。嗯哼?为什么不是break的作用呢?分明现已return@forEach了呀,其实这是Kotlin闭包带来的副作用,看下forEach的源码:

public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit {
    //留意看下面这行代码的逻辑
    for (element in this) action(element)
}

action函数作为参数传入的,所以在forEachreturn@forEach 只能停止当前闭包的逻辑,后边的循环并不会受影响,会持续后边的循环。那么如何在forEach中模仿break的作用呢?只需把声明Label放到forEach外面即能够了

fun forEachControl() {
    run loop@{//1
       listOf(1, 2, 3, 4, 5).forEach {
          if (it == 3) return@loop//2
          println("it:$it")
        }
          println("循环外持续履行")
        }
    }

履行成果:

it:1
it:2

能够看到1处的Label标签放到了forEach的外层了,那么当履行2处的return@loop时会直接跳出forEach循环,从而实现了break功用。

材料

【1】Kotlin回来和跳转:https://www.kotlincn.net/docs/reference/returns.html

欢迎扫描下方二维码或搜索微信大众号 代码说, 关注我的微信大众号查看最新文章~

Kotlin | 在for、forEach循环中正确的使用break、continue