⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/weixin_39597399/article/details/114232746 「weixin_39597399」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

情景展示

forEach中的 continue

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

执行结果如下:

forEach中的 continue

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

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

原因分析

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

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

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

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

我们来看看源码:

forEach 源码

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

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

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

解决方案

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

Java foreach 循环

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

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

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

Java foreach 循环

for 循环可以提前终止。

方式一:break

foreach 循环 break

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

foreach 循环 return

方案二:抛出异常

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

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

forEach 抛出异常

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

forEach 抛出异常进行终止

这样,就完美了。

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

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

文章目录
  1. 1. 情景展示
    1. 1.1. 原因分析
    2. 1.2. 解决方案