最近在代码评审的时候,发现看到同事使用 kotlin 的forEach,他以为使用 return@forEach 就可以退出了,相当于 break,但其实并不是,只是相当于 for 的 continue。

一. 问题复现

那么,如何正确退出 forEach呢?
先看这段代码,打印出什么?

listOf(1, 2, 3, 4, 5).forEach {if (it == 3) return@forEach print(it)
}

打印如下:

1
2
4
5

嗯,看起来就相当于 for 的continue,去到forEach源码看看:

public inline fun <T> Array<out T>.forEach(action: (T) -> Unit): Unit {for (element in this) action(element)
}

它是Array的扩展函数,用了一个高级去循环,所以当 return@forEach 的时候,只是当前这个 action 不执行而已。

1.1 @forEach 怎么来的?

在正确退出forEach 之前,先说说 @forEach 是怎么来的?
在Kotlin 中,任何函数都可以加标签,标签的格式为标识符后跟 @ 符号,例如:abc@,比如上面的代码,我们其实可以改成:

listOf(1, 2, 3, 4, 5).forEach  loop@{if (it == 3) return@loopprint(it)
}

效果是一样的,@forEach 是它的隐式标签

二、 正确退出forEach

可以通过增加另一层嵌套 lambda 表达式,如 loop@,然后使用 return@loop 退出,如下

run loop@{listOf(1, 2, 3, 4, 5).forEach {if (it == 3) return@loopprint(it)
}
}

Kotlin -正确退出forEach相关推荐

  1. 正确退出activity_【单选题】下面退出 Activity 错误的方法是

    [单选题]下面退出 Activity 错误的方法是 更多相关问题 听对话,根据对话内容补全句中所缺的单词.1. Rose needs apples.2. The boy is making a ban ...

  2. 正确退出telnet 命令的方法

    很多时候 telnet 完就无法退出了,ctrl+c 有时也无法退出 后来找到了正确的命令 ctrl+]  然后在telnet 命令行输入 quit  就可以退出了.

  3. 正确退出activity_如何退出Activity

    如何退出Activity?如何安全退出已调用多个Activity的Application?对于单一Activity的应用来说,退出很简单,直接finish()即可. 当然,也可以用killProces ...

  4. 如何避免jps中一大堆spark-submit+Spark交互模式启动速度+正确的退出spark-shell/pyspark/SparkR/hbase的习惯

    如果经常强制退出交互模式,那么jps中就会有一大堆的submit 大概是因为纯面向对象语言的关系,交互式模式不支持Java. 启动交互式模式的命令 所属大数据组件 启动速度 编程语言 退出命令 spa ...

  5. forEach()退出循环的方法

    在for循环中退出循环有3种方式:return(终止).break(退出整个循环).continue(退出当次循环). forEach()只能识别上面三种退出循环中的return,其它都识别不了,且r ...

  6. 了解 C# foreach 内部语句和使用 yield 实现的自定义迭代器

    在本期专栏中,我将介绍我们在编程时经常用到的 C# 核心构造(即 foreach 语句)的内部工作原理.了解 foreach 内部行为后,便可以探索如何使用 yield 语句实现 foreach 集合 ...

  7. Kotlin 资源大全

    官网及文档 Kotlin 官网 Kotlin 文档 Kotlin 中文文档 Kotlin on GitHub 中文社区 掘金技术社区 教程 & 文章 视频教程 Kotlin 系列视频教程 开始 ...

  8. Android最全面试题整理、还有Kotlin

    目录 1.理解线程间通信 2.工作者线程(workerThread)与主线程(UI线程)的理解 3.通过Handler在线程间通信的原理 4.子线程发消息到主线程进行更新 UI,除了 handler ...

  9. C#中WinForm程序退出方法技巧总结

    在c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit();Application.ExitThread(); System.Environme ...

最新文章

  1. java常见证书类型和密钥库类型
  2. 如何通过 Serverless 技术降低微服务应用资源成本?
  3. (Prototype)原型模式的Java实现(转)
  4. 研究生一年级,非计算机专业,自学机器学习现实吗?
  5. python android自动化基于java_Appium+Python自动化 1 环境搭建(适用windows系统-Android移动端自动化)...
  6. C++模拟键盘操作窗口入门
  7. Codeforces Round #615 (Div. 3) A-F
  8. SpringBoot—Entity父子类表@Inheritance和@MappedSuperclass
  9. 2019春运大幕即将开启 西安动车列车员整装迎春运
  10. on where having总结
  11. 【JAVA单元测试】单元测试模拟高并发操作
  12. 基于Linux的小项目-在线词典
  13. ExpandableListView 的使用
  14. 速记软考之木马和病毒
  15. 使用SurfaceView完成地图无缝拼接
  16. 关于十二平均律及律学发展简史
  17. 用树莓派做服务器运行博客网页
  18. 计算机cpu为什么有版本之分,CPU怎么看性能好坏 最新CPU天梯图2016年9月-11月版本(台式机)...
  19. 神器 logging,你真的了解吗?
  20. XYOJ1259: 找零钱(除法 余数)

热门文章

  1. java 二维数组 排序_二维数组排序
  2. Jenkins 分布式部署
  3. 欺骗的艺术——第二部分(10)
  4. 专业游戏录屏软 Camtasia 2023强悍来袭,Camtasia 2023软件安装激活教程
  5. oracle数据库 生成awr报告、ash报告详细步骤
  6. 11个JavaScript代码重构最佳实践
  7. 计算机配置的说明,如何选择计算机配置选择计算机配置方法[详细说明]
  8. 产业分析:中小微企业融资
  9. 计算机教室常规管理工作有哪些,计算机教室工作计划2011.doc
  10. ios 获取本地音乐