Kotlin 学习——返回和跳转(break、continue、return)

    Kotlin 的跳转表达式有三种:return、break、continue

    return:默认从直接包围它的函数或者匿名函数返回

    break:终止最直接包围它的循环

    continue:继续下一次直接包围它的循环

    在 Kotlin 中任何表达式都可以使用标签(label)来标记,使用方法为在代码块前加上标签符后跟 @ 符号,如 flag@、abc@ 等等,标签符由自己决定,使用方法如下:

flag@for (i in 1..10){}

    break 和 continue 可以和标记的标签一起使用,其结果与 break 和 continue 的原生结果一致,不过只是使用标签来指定 break 和 continue 作用的循环。break 是跳转到该标签指定循环的后续执行点,而 continue 是继续执行指定循环的下一次迭代,我们通过一个例子来说明:

fun main(args: Array<String>) {

    println("break 和标签一起使用:")
    flag1@for (i in 1..10){
        for (j in 1..10){
            if (true){
                println("$i + $j")
                break@flag1
            }
        }
    }

    println("continue 和标签一起使用的:")
    flag2@for (i in 1..10){
        for (j in 1..10){
            if (true){
                println("$i + $j")
                continue@flag2
            }
        }
    }
}

    结果:


    这个例子就能和直观体现它们的区别:break 从标签 flag1 跳出,执行 flag1 循环的后面的代码,而 continue 则执行 flag2 后面的循环的接下来的迭代。

    return 的简单使用:

fun main(args: Array<String>) {
    answer()
}
fun answer() {
    // 数组的迭代器有一个 Iterable.forEach() 方法,里面传入了一个参数 it,为数组中的参数,我们能进行操作
    listOf(1, 2, 3, 4, 5).forEach {
        if (it == 3) return 
        print(it)
    }
}

    结果:


    可以看到当 it==3 时,return 让整个函数直接跳出了,所以只输出了 12

    那如果我们不从外层函数返回,从 lambda 表达式中返回呢?这里有两种方法:

fun main(args: Array<String>) {
    answer1()
    println()
    answer2()
    println()
    answer3()
}

// 第一种:标签和 return 一起使用
fun answer1() {
    listOf(1, 2, 3, 4, 5).forEach flag@{
        if (it == 3) return@flag
        print(it)
    }
}
// 第二种:使用隐式标签,该标签与接受该 lambda 的函数相同
fun answer2() {
    listOf(1, 2, 3, 4, 5).forEach {
        if (it == 3) return@forEach
        print(it)
    }
}
// 第三种:使用匿名函数代替 lambda,返回是从匿名函数返回,不是从外层函数返回
fun answer3() {
    listOf(1, 2, 3, 4, 5).forEach (fun(value:Int){
        if (value == 3) return
        print(value)
    })
}

    结果:


    这里可以看到,return 只从 lambda 表达式中或者匿名函数返回了,并未从外部函数返回,继续执行输出了 45 。




猜你喜欢

转载自blog.csdn.net/young_time/article/details/80462849