发布于 5年前

Kotlin:return与跳转

Kotlin有两种跳转:循环跳转(break与continue)和返回跳转(return)。

Label

label语法:

labelName@

label可以放在任何表达式之前,用来标记表达式。如

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

break和continue

break和continue用于循环的跳转。

  • break默认情况下跳出最近的循环语句。
  • continue默认为跳出最近循环语句当前的一次迭代,继续执行下一次迭代。

break示例

for (i in 1..100) {
    for (j in 1..100) {
        if (...) break
    }
}

break跳出了里面的for循环语句。

continue示例

for (i in 1..100) {
    for (j in 1..100) {
        if (...) continue
    }
}

continue跳出里面for循环语句的当前迭代,继续执行里面for循环语句的下一次迭代。

默认情况下,break和continue是以最近的循环语句跳转。在多个内嵌循环里,可以使用label来跳转。

loop@ for (i in 1..100) {
    for (j in 1..100) {
        if (...) break@loop
    }
}

与前面的break示例不同,此处break会跳出loop@标记的for循环。

return

return语句默认为跳出最近的函数。

fun foo() {
    ints.forEach {
        if (it == 0) return 
        print(it)
    }
}

在此示例里,return会跳出foo函数,而不是跳出forEach里的lambda表达式。

如果需要在lambda表达式返回有两种方法

  • 把lambda表达式改为匿名函数
  • 结合label使用

匿名函数

fun foo() {
    ints.forEach(fun(value: Int) {
        if (value == 0) return 
        print(value)
    })
}

这里return跳出的是匿名函数,因为最近的函数为在forEach里定义的匿名函数。

结合label使用

结合label使用,可以让return在lambda表达式返回。

fun foo() {
    ints.forEach lit@ {
        if (it == 0) return@lit
        print(it)
    }
}

此处在forEach里的lambda表达式返回。更简单的方法是使用调用lambda表达式的函数作为标签,如forEach

上面的例子等同于

fun foo() {
    ints.forEach {
        if (it == 0) return@forEach
        print(it)
    }
}

return除了跳出指定的label外,也可以在跳出处返回一个值。

return@a 1

这里的return表示在@a处返回1.

©2020 edoou.com   京ICP备16001874号-3