Kotlin 官方学习教程之返回和跳转

x33g5p2x  于2022-03-08 转载在 其他  
字(0.9k)|赞(0)|评价(0)|浏览(413)

Kotlin 有三个结构跳转表达式:

  • return 默认从最近的封闭函数或匿名函数返回
  • break 终止最近的封闭循环
  • 前往最近的封闭循环的下一步

所有这些表达式都可以用作更大表达式的一部分:

val s = person.name ?: return

Break 和 Continue 标签

在 Kotlin 中表达式可以添加标签。标签通过 @ 结尾来表示,比如:abc@,fooBar@ 都是有效的。使用标签语法只需像这样:

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

现在我们可以用标签实现 break 或者 continue 的快速跳转:

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

break 是跳转标签后面的表达式,continue 是跳转到循环的下一次迭代。

在标签返回

使用字面函数,局部函数,以及对象表达式中,函数可以在 Kotlin 中被嵌套。return 允许我们返回到外层函数。最重要的用例是从lambda表达式返回。回想一下,当我们写这个:

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

return 表达式返回到最近的闭合函数,比如 foo (请注意,这种非本地返回仅适用于传递给内联函数的 lambda 表达式)。如果我们需要从 lambda 表达式返回,我们必须对它进行标注并限定返回值:

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

现在,它仅仅从 lambda 表达式返回。通常,使用 implicits 标签更方便:这样的标签与传递 lambda 的函数具有相同的名称。

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

另外,我们可以使用匿名函数来代替 lambda 表达式。

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

当返回值时,解析器优先考虑符合的返回值,即:

return@a 1

表示 “在标签 @a 返回 1 ” 而不是返回一个标签表达式 (@a 1)

相关文章