Kotlin forEach中实现break
Kotlin
线上编写练习
Kotlin官网提供了 PlayGround 供大家线上尝试
地址:https://play.kotlinlang.org/
文章目录
- 前言
- 解决方式
- 遇到得问题
- 结语
- 参考文献
前言
切换为 Kotlin 后很多函数使用还不太习惯。
最近就遇到了如何在forEach
中使用break
的问题。
解决方式
老规矩,先说解决方式,如果确定就是要在forEach
类似函数中使用的话。
- 可以考虑在外层包裹一层
lambda
然后使用return@
返回标签操作。
例如下:
我使用run
函数包裹,通过return@run
得到我想要得结果,并终止遍历。
fun main(){val result = (1..6).run {forEach {if (it > 3) {println("forEach -> $it > 3 , can break")return@run "num $it"}println("forEach -> $it")}}println("out -> $result")
}// 运行结果如下
forEach -> 1
forEach -> 2
forEach -> 3
forEach -> 4 > 3 , can break
out -> num 4
遇到得问题
因为在使用forEach
得时候下意识得使用得匿名标签得返回。
fun main(){var result = ""(1..6).forEach {if (it > 3) {println("forEach -> $it > 3 , can break")result = "num $it"return@forEach}println("forEach -> $it")}println("out -> $result")
}// 运行结果
forEach -> 1
forEach -> 2
forEach -> 3
forEach -> 4 > 3 , can break
forEach -> 5 > 3 , can break
forEach -> 6 > 3 , can break
out -> num 6
显然,我期望是能得到num 4
这个结果,但是运行结果显然return@forEach
并没有中止循环,看上去更像是continue
类似的操作。
咱们参考下源码一看便知。
/*** Performs the given [action] on each element.*/
@kotlin.internal.HidesMembers
public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit {for (element in this) action(element)
}
很明显,我们return
的只是action。并不会影响for
循环的运行。
所以可以在外层再做一次嵌套,保证可以通过标签return
到自己想要的位置,达到中止循环的目的。
如果不用forEach
的话,还是可以使用for
循环中正常的break
,continue
等操作,在for
循环中也可以通过显示标签控制返回的位置。
结语
Kotlin 有很多非常合适的高阶函数,我这边确实需要遍历集合根据一些条件做其它操作。如果只是获取集合中的一些信息,可以考虑使用集合的一些高阶操作。而不必使用遍历的方式,显得不够优雅。
参考文献
Break and continue labels
Break and continue labels (Kotlin中文网)
Kotlin forEach中实现break相关推荐
- 在Java8的foreach()中不能break,如果需要continue时,可以使用return
今天使用lambda表达式处理集合时,发现对return.break以及continue的使用有点迷惑,于是自己动手测试了一下,才发现在使用foreach()处理集合时不能使用break和contin ...
- Kotlin在forEach中如何跳出循环和跳出当前循环体
一.数组的forEach中直接retrun fun main(args: Array<String>) {val arr = intArrayOf(1,2,3,4,5,6,7)arr.fo ...
- R语言-循环repeat,while,for,foreach,iter,next,break
R中有三种不同的循环结构: 1.repeat结构 它只是简单的重复同一个表达式:repeat expression,如果要跳出循环,可以使用break命令,若要跳至循环中的下一轮迭代,需要使用next ...
- 简述Python中的break和continue的区别
众所周知在Python中,break是结束整个循环体,而continue则是结束本次循环再继续循环. 但是作为一个新手的你,还是不明白它们的区别,这里用一个生动的例子说明它们的区别,如下: 1.con ...
- Scala中没有break和continue, 如何退出循环
Java是指令式风格,Scala是函数式风格. 在Scala中,应该尽量适用循环,而是应用函数的方式来处理. Scala并没有提供break和continue语句来退出循环,那么如果我们又确实要怎么办 ...
- C# - 在foreach中删除元素
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在for ...
- 面试:为什么foreach中不允许对元素进行add和remove
来源 | 公众号 我是程序汪 阿粉的读者遇到了一个比较经典的面试题,也就是标题上说的,为什么 foreach 中不允许对元素进行 add 和 remove.阿粉就这个问题深入分析一下为什么不让使用 a ...
- 【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )
文章目录 一.创建支持 Kotlin 的 NDK 项目 二.Kotlin 语言中使用 NDK 要点 1.加载动态库 2.声明 ndk 方法 3.Project 下的 build.gradle 配置 4 ...
- JAVA中的break[标签]continue[标签]用法
原文:JAVA中的break[标签]continue[标签]用法 注意:JAVA中的标签必须放在循环之前,且中间不能有其他语句.例如:tag:for或while或do--while; 1.使用brea ...
最新文章
- Asp.Net Core异常处理整理
- keil单片机C语言输入函数,keil编写C程序是不是不能在函数内定义变量啊,求大神...
- 罗汉塔最少步骤_如何以最少的步骤压缩和密码保护文件?
- IDC机房对接阿里云
- mysql 事件 函数_MySQL 自定义函数和存储过程的使用
- HDU 2076 夹角有多大
- 推荐一个字体工具:Fontmin
- SQL插入数据-insert用法
- Request textDocument/codeAction failed.
- html重复渐变包括,CSS3怎么实现重复线性渐变效果
- Android Timer和TimerTask解决IllegalStateException:Task already scheduled or cancelled
- Jetson Xavier NX-EMMC重装系统
- mysql没开启binlog恢复数据_MySQL:binlog恢复数据
- 使用runas命令让域用户可以以管理员权限运行程序
- 【AndroidStudio】按钮基本操作(普通按钮、图片按钮、单选按钮设置)(单击事件监听器触发对话框和页面跳转)
- Linux centos搭建web服务器
- 读文件并算出平均数&找出排名前3的成绩(c语言 可运行)
- 【万字好文】一文看懂持续部署按需发布!DevOps部署和发布方法大全
- Diagnostic Plane Extraction from 3DParametric Surface of the Fetal Cranium胎儿颅骨三维参数表面的诊断平面提取
- Centos7.9、Ubuntu操作系统图文安装