首页 > 其他分享 >Kotlin | 在for、forEach循环中正确的使用break、continue

Kotlin | 在for、forEach循环中正确的使用break、continue

时间:2023-09-25 22:32:22浏览次数:69  
标签:return Kotlin break continue forEach println 循环

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

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

for循环中使用break、continue

for (i in 1..5) {
    if (i == 3) break //1 这里分别使用break continue return
    println("i: $i")
 }
 println("循环外继续执行")

1处分别使用break、continue、return 替换,执行结果如下:

//break 
i: 1
i: 2
循环外继续执行

//continue
i: 1
i: 2
i: 4
i: 5
循环外继续执行

//return
i: 1
i: 2

嗯,跟Java中的使用姿势是一样的,继续往下看。

Label标签

在 Kotlin 中任何表达式都可以用标签(label)来标记。 标签的格式为标识符后跟 @ 符号,例如:abc@、loop@都是有效的标签。 要为一个表达式加标签,我们只要在其前加标签即可。示例:

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

这里在嵌套for循环中使用Label,可以控制break及continue的范围:

loop@ for (i in 1..2) {
    println("i: $i")
    for (j in 1..5) {
        if (j == 3) break@loop //break continue
        println("j: $j")
    }
}
println("循环外继续执行")

执行结果:

//break
i: 1
j: 1
j: 2
循环外继续执行

//continue
i: 1
j: 1
j: 2

i: 2
j: 1
j: 2
循环外继续执行

结论:Label标签限制的 break 跳转到刚好位于该标签指定的循环后面的执行点。 continue 继续标签指定的循环的下一次迭代

注意不能在上述代码中使用return@loop,因为目标标签表示的不是函数,错误信息如下:

Target label does not denote a function

forEach中模拟break、continue

在forEach中并不能直接使用break、continue:

Kotlin | 在for、forEach循环中正确的使用break、continue_Kotlin

可以看到直接报错了,错误信息也很明确:break 和 continue 只允许在循环中使用,而这里是forEach的闭包,所以并不能直接使用break 和 continue。那么如何在forEach中分别模拟出break、continue的效果呢?通过Label即可实现,如:

fun forEachControl() {
    listOf(1, 2, 3, 4, 5).forEach forEach@{
        if (it == 3) return@forEach
        println("it:$it")
    }
    println("循环外继续执行")
}

return 只会从 lambda 表达式中返回。通常情况下使用隐式标签更方便(Label 标签与接受该 lambda 的函数同名即可使用隐式标签),简化之后:

fun forEachControl() {
    listOf(1, 2, 3, 4, 5).forEach{
        if (it == 3) return@forEach
        println("it:$it")
    }
    println("循环外继续执行")
}

代码执行结果:

it:1
it:2
it:4
it:5
循环外继续执行

可以看到return@forEach相当于表达式里面的continue了。嗯哼?为什么不是break的效果呢?明明已经return@forEach了呀,其实这是Kotlin闭包带来的副作用,看下forEach的源码:

public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit {
    //注意看下面这行代码的逻辑
    for (element in this) action(element)
}

action函数作为参数传入的,所以在forEachreturn@forEach 只能停止当前闭包的逻辑,后面的循环并不会受影响,会继续后面的循环。那么如何在forEach中模拟break的效果呢?只要把声明Label放到forEach外面即可以了

fun forEachControl() {
    run loop@{//1
       listOf(1, 2, 3, 4, 5).forEach {
          if (it == 3) return@loop//2
          println("it:$it")
        }
          println("循环外继续执行")
        }
    }

执行结果:

it:1
it:2

可以看到1处的Label标签放到了forEach的外层了,那么当执行2处的return@loop时会直接跳出forEach循环,进而实现了break功能。

标签:return,Kotlin,break,continue,forEach,println,循环
From: https://blog.51cto.com/u_16175630/7600359

相关文章

  • Kotlin-大师班 第五章-随笔
    数组Array1.基础数据类型Array 2.arrayOf:基础类型、字符串、自定义类对象,甚至类,甚至不同类型放在这一个数组里。 3.不可变集合三兄弟,除了他们仨后面的都可变。 4.可变集合ArrayList,arrayListOf,mutabalListOfmutableSetOf,hashSetOfHashMap,hashMapOf,mutableMa......
  • Kotlin 基础语法
    Kotlin文件以.kt为后缀。包声明包的声明应处于源文件顶部:packagemy.demoimportjava.util.*//……kotlin源文件不需要相匹配的目录和包,源文件可以放在任何文件目录。如果没有指定包,默认为 default 包。默认导入有多个包会默认导入到每个Kotlin文件中:kotlin.*kotlin.an......
  • noip Template (to be continued)
    \(noip\Templates\)\(Part1\Graph\)ToposortDijkstraSPFAFloydKruskalPrimTarjanLCA\(Graph\)0.链式前向星存图inth[N],e[N],ne[N],idx;//对于每个点k开一个单链表,存储所有可以走到的点。h[k]存储单链表头结点//添加一条边a->bvoidadd(inta,intb)......
  • Python break 语句
    Pythonbreak语句,就像在C语言中,打破了最小封闭for或while循环。break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句。break语句用在while和for循环中。如果您使用嵌套循环,break语句将停止执行最深层的循环,并开始执行下一行代码。Pytho......
  • Python continue 语句
    Pythoncontinue语句跳出本次循环,而break跳出整个循环。continue语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下一轮循环。continue语句用在while和for循环中。Python语言continue语句语法格式如下:continue流程图:实例:实例(Python2.0+)#!/usr/bin/python#-*-codi......
  • Kotlin第一弹:Kotlin详细介绍
    https://blog.csdn.net/m0_58941767/article/details/126679953 前言Kotlin是什么?一、为什么优先使用Kotlin进行Android开发?二、Kotlin优先意味着什么?三、Kotlin能做什么?四、我们也使用Kotlin五、Kotlin常见问题六、Kotlin必知必会总结  Kotlin是什么?Kotlin是一......
  • Kotlin逆袭Java,能否撼动其地位?
    前言近日,TIOBE官网近日公布了2023年9月的编程语言排行榜。Python又一次排行第一,占比14.16%、C语言排行第二,占比11.27%、C++排行榜单第三,占比为10.65%。意外的是,对标Java的Kotlin却挤进前20,占比0.9%。与Java一样,Kotlin也是用于Android应用程序开发的编程语言,作为2016年的......
  • Java(day17):Java 的循环退出语句 break、continue
    在Java中,循环是一种重要的控制流结构,它允许程序重复执行某段代码,直到满足特定的条件为止。但在某些情况下,我们可能需要在循环中提前退出或跳过某些迭代。这时我们可以使用Java中的两个循环控制语句:break和continue。break语句break语句用于完全退出当前所在的循环,不再执行循环中......
  • EMPIRE: BREAKOUT
    Download:https://download.vulnhub.com/empire/02-Breakout.zipDescriptionDifficulty:EasyThisboxwascreatedtobeanEasybox,butitcanbeMediumifyougetlost.ForhintsdiscordServer(https://discord.gg/7asvAhCEhe)一:信息收集netdiscover探测IPC......
  • 不知道如何入门Kotlin?《Android版kotlin协程入门进阶实战》带你从入门,带你飞
    作为一名Android开发者,掌握Kotlin语言对于职业发展具有重要意义。随着Google正式将Kotlin确立为Android开发的官方编程语言,Kotlin的地位在Android开发领域迅速攀升。因此,仅仅依靠Java语言进行开发已经不能满足当前市场需求。作为一名Android开发者,学习和掌握Kotl......