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)
作者:jim__charles 发表于2017/5/27 12:04:10 原文链接
阅读:57 评论:0 查看评论