Kotlin 全面学习之路 (三) -- 返回和跳转

在 Kotlin 中和 Java 中一样有三种结构化跳转表达式:

  • return。默认从最直接包围它的函数或者匿名函数返回。
  • break。终止最直接包围它的循环。
  • continue。继续下一次最直接包围它的循环。

从上面的表述我们了解和 Java 中没有什么区别,在此就不多作描述,但是在 Kotlin 中他们有一个叫做 标签 的概念。

1、标签

Kotlin 中 任意表达式 都可以使用标签来标记。标签的格式为标识符后跟 @ 符号,例如:abc@
为表达式加标签:

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

2、Break 与 Continue 标签 – 标签处跳转

我们可以用标签限制 break 或者 continue,标签限制的 break 跳转到刚好位于该标签指定的循环后面的执行点。 continue 继续标签指定的循环的下一次迭代。但是很明显的是 我们可以通过标签改变 breakcontinue 原本的跳转逻辑,见下例:

for (i in 1..10) {
   loop@for (j in 1..10)
      if (i * j > 50) {
         println("i is $i, j is $j")
         break@loop
       }
 }

此时,break 就失去了其原本的跳转逻辑 – 终止最直接包围它的循环, 而是调整到标签处继续执行逻辑, 日志打印信息如下:

i is 6, j is 9
i is 7, j is 8
i is 8, j is 7
i is 9, j is 6
i is 10, j is 6

同理。标签也可以更改 continue 原本的跳转逻辑,

loop@for (i in 1..10) {
 for (j in 1..10)
      if (i * j > 50) {
         println("i is $i, j is $j")
         continue@loop
       }
 }

3、标签处返回

标签处返回的含义和标签处的跳转的表示意义差不多,即摒弃原来的返回逻辑,返回至标签处去执行业务逻辑。

private val list = listOf<String>("t3e","ifefef","45")
fun foo() {
        list.forEach {
            println(it)
            it.forEach lit@{
                if (it.toString() == "i") return@lit
                println(it)
            }

        }
    }

打印日志为:

t3e
t
3
e
ifefef
f
e
f
e
f
45
4
5

很明显,return 并没有按照原有逻辑进行返回,而按照标签仅仅在 “i” 时没有执行 println(it) 操作。

猜你喜欢

转载自blog.csdn.net/Strange_Monkey/article/details/82533655