标签与跳转

标签

kt 中任何表达式都可以用标签(label)来标记。

定义与引用

  1. 定义时的格式为:标签名后跟 @ 符号,例如:abc@fooBar@都是有效的标签。

  2. 引用的格式为:@ 后跟标签名

loop@ for (i in 1..100) {
    for (j in 1..100) {
        if (……) break@loop
    }
}
  1. 为调用函数的语句定义标签时,标签需要定义在方法后。如果没有显式指定标签,则默认的标签名是方法名

    fun main(args: Array) {
        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。

  1. return 后有标签时,会结束标签对应的函数。

  2. 如果 return 后的标签是一个循环函数(如 forEach,filter),相当于 continue。

break 与 continue

功能与 Java 中一样。只不过在 forEach 等循环函数中的时候,没有办法使用。

  1. 可以使用 return+标签 代替 continue。

  2. 使用 run 函数,并对 run 函数的标签进行 return 来代替 break。

fun main(args: Array) {
    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。

你可能感兴趣的:(标签与跳转)