美文网首页Kotlin
Kotlin返回和跳转(配合标签)

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

作者: 漆先生 | 来源:发表于2021-03-26 09:35 被阅读0次

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

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

    一、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
    

    相关文章

      网友评论

        本文标题:Kotlin返回和跳转(配合标签)

        本文链接:https://www.haomeiwen.com/subject/wpvlhltx.html