Kotlin

Kotlin返回和跳转(配合标签)

2021-03-26  本文已影响0人  漆先生

Kotlin 有三种结构化跳转表达式:

一、Break 与 Continue 标签

标签限制的 break 跳转到刚好位于该标签指定的循环后⾯的执⾏点。

loop@ for (i in 1..4) {
    for (j in 1..4) {
        if (i == 2 && j == 2) {
            break@loop
        }
        println("MainActivity tagAndBreak i = $i, j = $j")
    }
}

输出:

System.out: MainActivity tagAndBreak i = 1, j = 1
System.out: MainActivity tagAndBreak i = 1, j = 2
System.out: MainActivity tagAndBreak i = 1, j = 3
System.out: MainActivity tagAndBreak i = 1, j = 4
System.out: MainActivity tagAndBreak i = 2, j = 1

标签限制的continue 继续标签指定的循环的下⼀次迭代。

tagsDemo@ for (i in 1..4) {
    for (j in 1..4) {
        if (i == 2 && j == 2) {
            continue@tagsDemo
        }
        println("MainActivity tagAndContinue i=$i,  j=$j")
    }
}

输出:

System.out: MainActivity tagAndContinue i=1,  j=1
System.out: MainActivity tagAndContinue i=1,  j=2
System.out: MainActivity tagAndContinue i=1,  j=3
System.out: MainActivity tagAndContinue i=1,  j=4
System.out: MainActivity tagAndContinue i=2,  j=1
System.out: MainActivity tagAndContinue i=3,  j=1
System.out: MainActivity tagAndContinue i=3,  j=2
System.out: MainActivity tagAndContinue i=3,  j=3
System.out: MainActivity tagAndContinue i=3,  j=4
System.out: MainActivity tagAndContinue i=4,  j=1
System.out: MainActivity tagAndContinue i=4,  j=2
System.out: MainActivity tagAndContinue i=4,  j=3
System.out: MainActivity tagAndContinue i=4,  j=4

二、返回到标签

//使⽤的局部返回类似于在常规循环中使⽤ continue
listOf(1, 2, 3, 4, 5).forEach lit@{
    if (it == 3) return@lit    // 局部返回到该 lambda 表达式的调⽤者,即 forEach 循环
    println("MainActivity tagAndReturn  explicit label (显示标签)$it")
}

listOf(1, 2, 3, 4, 5).forEach {
    if (it == 3) return@forEach    // 局部返回到该 lambda 表达式的调⽤者,即 forEach 循环
    println("MainActivity tagAndReturn  explicit label (隐式标签)$it")
}

listOf(1, 2, 3, 4, 5).forEach(fun(value: Int) {
    if (value == 3) return // 局部返回到匿名函数的调⽤者,即 forEach 循环
    println("MainActivity tagAndReturn anonymous function(匿名函数)$value")
})

//有 break 的直接等价形式
//当要返⼀个回值的时候,解析器优先选⽤标签限制的 return,即return@loop 1  意为“返回 1 到 @loop ”
run loop@{
    listOf(1, 2, 3, 4, 5).forEach {
        if (it == 3) return@loop // 从传⼊ run 的 lambda 表达式⾮局部返回
        println("MainActivity tagAndReturn nested loop $it")
    }
}

输出:

2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn  explicit label (显示标签)1
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn  explicit label (显示标签)2
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn  explicit label (显示标签)4
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn  explicit label (显示标签)5
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn  explicit label (隐式标签)1
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn  explicit label (隐式标签)2
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn  explicit label (隐式标签)4
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn  explicit label (隐式标签)5
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn anonymous function(匿名函数)1
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn anonymous function(匿名函数)2
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn anonymous function(匿名函数)4
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn anonymous function(匿名函数)5
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn nested loop 1
2021-03-25 13:28:40.862 20952-20952/com.kuaipi.createkotlin I/System.out: MainActivity tagAndReturn nested loop 2
上一篇下一篇

猜你喜欢

热点阅读