标签
kt 中任何表达式都可以用标签(label)来标记。
定义与引用
定义时的格式为:标签名后跟
@
符号,例如:abc@
、fooBar@
都是有效的标签。引用的格式为:
@
后跟标签名
loop@ for (i in 1..100) {
for (j in 1..100) {
if (……) break@loop
}
}
-
为调用函数的语句定义标签时,标签需要定义在方法后。如果没有显式指定标签,则默认的标签名是方法名:
fun main(args: Array<String>) { val p = listOf("a", "b", "c") test outer@ { p.forEach { if (it == "b") return@outer println(it) } } println("end") } inline fun test(t: (Int) -> Unit) { t(22) }
上述代码在遍历到 b 时,会跳出 test 方法。下面是不同的 return 时代码的输出
语句 | 输出结果 | 说明 |
---|---|---|
return@outer | a、end | 结束 test 函数 |
return@forEach | a、c、end | 类似于 continue,进行下一个元素 |
return | a | return 结束离其最近的一个 fun |
注意:这里的 test 必须定义成 inline 函数,否则不能直接使用 return。
跳转
kt 中的跳转语句有三种: return,break,continue
return
结束一个函数。其只能结束离它最近的 fun。
return 后有标签时,会结束标签对应的函数。
如果 return 后的标签是一个循环函数(如 forEach,filter),相当于 continue。
break 与 continue
功能与 Java 中一样。只不过在 forEach 等循环函数中的时候,没有办法使用。
可以使用
return+标签
代替 continue。使用 run 函数,并对 run 函数的标签进行 return 来代替 break。
fun main(args: Array<String>) {
val s = arrayListOf(12, 34,56)
println("continue")
s.forEach test@{
if (it == 34) return@test
println(it)
}
println("break")
run {
s.forEach{
if(it == 34) return@run
println(it)
}
}
}
在 break 语句后只会输出 12,因为 return@run 表示结束 run 函数,所以对于 forEach 来说,相当于 break。