Kotlin Lambda的返回

Stranger 2020-05-16

先看下面这个代码,有问题不?
repeat(10) {
    if (it == 3) break
    println(it)
}

 答案是编译通不过地。

  • break,是loop的兄弟,只能在for, while这些地方使用

那如果我想从那里面跳出来,怎么破?先看下面这个

fun main(args: Array<String>) {
    repeat(10) {
        if (it == 3) return@repeat
        print(it)
    }
    println("hello")
}

这段代码会输出:

012456789hello

看样子return@repeat起到了类似continue的作用,把3的打印跳过了。那如果我像下面这样直接return呢?

fun main(args: Array<String>) {
    repeat(10) {
        if (it == 3) return
        println(it)
    }
    println("hello")
}

 输出结果变成:

012

所以,如果只用return的话,会直接导致调用repeat的函数(main)直接return了。

思考......如果我就想像loop的break那样,从这些lambda里面跳出来而又不导致外部函数被return。换句话说,如果我想输出012hello, 那该如何破?且看下面这段:

fun main(args: Array<String>) {
    run loop@{
        repeat(10) {
            if (it == 3) return@loop
            print(it)
        }
    }
    println("hello")
}

所以,结论是只有通过在repeat的外层再包一层lambda并且设置上label,才能模拟出“break”的效果。

相关推荐