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相关推荐

  1. 在Java8的foreach()中不能break,如果需要continue时,可以使用return

    今天使用lambda表达式处理集合时,发现对return.break以及continue的使用有点迷惑,于是自己动手测试了一下,才发现在使用foreach()处理集合时不能使用break和contin ...

  2. Kotlin在forEach中如何跳出循环和跳出当前循环体

    一.数组的forEach中直接retrun fun main(args: Array<String>) {val arr = intArrayOf(1,2,3,4,5,6,7)arr.fo ...

  3. R语言-循环repeat,while,for,foreach,iter,next,break

    R中有三种不同的循环结构: 1.repeat结构 它只是简单的重复同一个表达式:repeat expression,如果要跳出循环,可以使用break命令,若要跳至循环中的下一轮迭代,需要使用next ...

  4. 简述Python中的break和continue的区别

    众所周知在Python中,break是结束整个循环体,而continue则是结束本次循环再继续循环. 但是作为一个新手的你,还是不明白它们的区别,这里用一个生动的例子说明它们的区别,如下: 1.con ...

  5. Scala中没有break和continue, 如何退出循环

    Java是指令式风格,Scala是函数式风格. 在Scala中,应该尽量适用循环,而是应用函数的方式来处理. Scala并没有提供break和continue语句来退出循环,那么如果我们又确实要怎么办 ...

  6. C# - 在foreach中删除元素

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 在for ...

  7. 面试:为什么foreach中不允许对元素进行add和remove

    来源 | 公众号 我是程序汪 阿粉的读者遇到了一个比较经典的面试题,也就是标题上说的,为什么 foreach 中不允许对元素进行 add 和 remove.阿粉就这个问题深入分析一下为什么不让使用 a ...

  8. 【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )

    文章目录 一.创建支持 Kotlin 的 NDK 项目 二.Kotlin 语言中使用 NDK 要点 1.加载动态库 2.声明 ndk 方法 3.Project 下的 build.gradle 配置 4 ...

  9. JAVA中的break[标签]continue[标签]用法

    原文:JAVA中的break[标签]continue[标签]用法 注意:JAVA中的标签必须放在循环之前,且中间不能有其他语句.例如:tag:for或while或do--while; 1.使用brea ...

最新文章

  1. Asp.Net Core异常处理整理
  2. keil单片机C语言输入函数,keil编写C程序是不是不能在函数内定义变量啊,求大神...
  3. 罗汉塔最少步骤_如何以最少的步骤压缩和密码保护文件?
  4. IDC机房对接阿里云
  5. mysql 事件 函数_MySQL 自定义函数和存储过程的使用
  6. HDU 2076 夹角有多大
  7. 推荐一个字体工具:Fontmin
  8. SQL插入数据-insert用法
  9. Request textDocument/codeAction failed.
  10. html重复渐变包括,CSS3怎么实现重复线性渐变效果
  11. Android Timer和TimerTask解决IllegalStateException:Task already scheduled or cancelled
  12. Jetson Xavier NX-EMMC重装系统
  13. mysql没开启binlog恢复数据_MySQL:binlog恢复数据
  14. 使用runas命令让域用户可以以管理员权限运行程序
  15. 【AndroidStudio】按钮基本操作(普通按钮、图片按钮、单选按钮设置)(单击事件监听器触发对话框和页面跳转)
  16. Linux centos搭建web服务器
  17. 读文件并算出平均数&找出排名前3的成绩(c语言 可运行)
  18. 【万字好文】一文看懂持续部署按需发布!DevOps部署和发布方法大全
  19. Diagnostic Plane Extraction from 3DParametric Surface of the Fetal Cranium胎儿颅骨三维参数表面的诊断平面提取
  20. Centos7.9、Ubuntu操作系统图文安装

热门文章

  1. spring 依赖注入的三种方式
  2. Linux下安装配置Python
  3. 麻瓜们不知道的那些被环球影城藏起来的5G秘密
  4. 【What if 系列】水龙头发电机
  5. c 语言定义2维字符串数组赋值,二维数组赋值字符串 c 语言 二维字符串数组赋值问题...
  6. 【数学】方差、协方差、协方差矩阵
  7. 基于PHP的酒厂酿造生产仓储管理系统
  8. 浅谈execl函数的使用
  9. Execl根据一列分组,找出另外一列的最大值
  10. JAVASE的内、外部比较器Comparable和Comparator