面试官:Java8 lambda 表达式 forEach 如何提前终止?

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 
  • 原创 | Java 2021 超神之路,很肝~

  • 中文详细注释的开源项目

  • RPC 框架 Dubbo 源码解析

  • 网络应用框架 Netty 源码解析

  • 消息中间件 RocketMQ 源码解析

  • 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析

  • 作业调度中间件 Elastic-Job 源码解析

  • 分布式事务中间件 TCC-Transaction 源码解析

  • Eureka 和 Hystrix 源码解析

  • Java 并发源码

来源:blog.csdn.net/weixin_39597399/

article/details/114232746

  • 情景展示

    • 原因分析

    • 解决方案


情景展示

面试官:Java8 lambda 表达式 forEach 如何提前终止?_第1张图片 forEach中的 continue

如上图所示,我们想要终止 for 循环,使用 return。

执行结果如下:

2e0941e1139aee90093bd94e184b5f15.png forEach中的 continue

我们可以看到,只有赵六没被打印出来,后续的数组元素依旧被执行了。

也就是说,关键字return,在这里执行的效果相当于普通 for 循环里的关键词continue

原因分析

我们知道,在普通 for 循环里面,想要提前结束(终止)循环体使用break

结束本轮循环,进行下一轮循环使用continue

另外,在普通 for 里,如果使用return,不仅强制结束 for 循环体,还会提前结束包含这个循环体的整个方法。

而在 Java8 中的 forEach() 中 breakcontinue是不被允许使用的,而return的意思也不是原来 return 代表的含义了。

我们来看看源码:

面试官:Java8 lambda 表达式 forEach 如何提前终止?_第2张图片 forEach 源码

forEach(),说到底是一个方法,而不是循环体,结束一个方法的执行用什么?当然是return啦。

java8 的 forEach()和 JavaScript 的 forEach() 用法是何其的相似。

Java 不是万能的,不要再吐槽它垃圾了。

解决方案

方案一:使用原始的 foreach 循环

面试官:Java8 lambda 表达式 forEach 如何提前终止?_第3张图片 Java foreach 循环

使用过 eclipse 的老铁们应该知道,当我们输入:foreach,再按快捷键:Alt+/,就会出现 foreach 的代码提示。

如上图所示,这种格式的 for 循环才是真正意义上的 foreach 循环。

在 idea 中输入,按照上述操作是不会有任何代码提示的,那如何才能在 idea 中,调出来呢?

面试官:Java8 lambda 表达式 forEach 如何提前终止?_第4张图片 Java foreach 循环

for 循环可以提前终止。

方式一:break

面试官:Java8 lambda 表达式 forEach 如何提前终止?_第5张图片 foreach 循环 break

方式二:return (不推荐使用)

面试官:Java8 lambda 表达式 forEach 如何提前终止?_第6张图片 foreach 循环 return

方案二:抛出异常

我们知道,要想结束一个方法的执行,正常的逻辑是:使用 return

但是,在实际运行中,往往有很多不突发情况导致代码提前终止,比如:空指针异常,其实,我们也可以通过抛出假异常的方式来达到终止 forEach() 方法的目的。

面试官:Java8 lambda 表达式 forEach 如何提前终止?_第7张图片 forEach 抛出异常

如果觉得这种方式不友好,可以再包装一层。

面试官:Java8 lambda 表达式 forEach 如何提前终止?_第8张图片 forEach 抛出异常进行终止

这样,就完美了。

这里,需要注意的一点是:要确保你 forEach() 方法体内不能有其它代码可能会抛出的异常与自己手动抛出并捕获的异常一样;

否则,当真正该因异常导致代码终止的时候,因为咱们手动捕获了并且没做任何处理,岂不是搬起石头砸自己的脚吗?



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

面试官:Java8 lambda 表达式 forEach 如何提前终止?_第9张图片

已在知识星球更新源码解析如下:

面试官:Java8 lambda 表达式 forEach 如何提前终止?_第10张图片

面试官:Java8 lambda 表达式 forEach 如何提前终止?_第11张图片

面试官:Java8 lambda 表达式 forEach 如何提前终止?_第12张图片

面试官:Java8 lambda 表达式 forEach 如何提前终止?_第13张图片

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)

你可能感兴趣的:(java,python,android,多线程,c++)