面试官:Lambda 表达式中的 forEach 如何提前终止?这次被问倒了!
情景展示
如上图所示,我们想要终止for循环,使用return。
执行结果如下:
我们可以看到,只有赵六没被打印出来,后续的数组元素依旧被执行了。
也就是说,关键字"return",在这里执行的效果相当于普通for循环里的关键词continue"。
推荐一个开源免费的 Spring Boot 最全教程:
原因分析
我们知道,在普通for循环里面,想要提前结束(终止)循环体使用"break";
结束本轮循环,进行下一轮循环使用"continue";
另外,在普通for里,如果使用"return",不仅强制结束for循环体,还会提前结束包含这个循环体的整个方法。
而在Java8中的 forEach() 中,"break"或"continue"是不被允许使用的,而return的意思也不是原来return代表的含义了。
我们来看看源码:
forEach(),说到底是一个方法,而不是循环体,结束一个方法的执行用什么? 当然是return啦;
java8的forEach()和JavaScript的forEach()用法是何其的相似,感兴趣的可以去了解下(在文末)。
Java不是万能的,不要再吐槽它垃圾了。
解决方案
方案一:使用原始的foreach循环
使用过eclipse的老铁们应该知道,当我们输入:foreach,再按快捷键:Alt+/,就会出现foreach的代码提示。
如上图所示,这种格式的for循环才是真正意义上的foreach循环。
在idea中输入,按照上述操作是不会有任何代码提示的,那如何才能在idea中,调出来呢?
for循环可以提前终止。
方式一:break
方式二:return(不推荐使用)
方案二:抛出异常
我们知道,要想结束一个方法的执行,正常的逻辑是:使用return;
但是,在实际运行中,往往有很多不突发情况导致代码提前终止,比如:空指针异常,其实,我们也可以通过抛出假异常的方式来达到终止forEach()方法的目的。
如果觉得这种方式不友好,可以再包装一层。
这样,就完美了。
这里,需要注意的一点是:要确保你forEach()方法体内不能有其它代码可能会抛出的异常与自己手动抛出并捕获的异常一样;
否则,当真正该因异常导致代码终止的时候,因为咱们手动捕获了并且没做任何处理,岂不是搬起石头砸自己的脚吗?
来源:https://blog.csdn.net/weixin_39597399
近期热文推荐:
1.1,000+ 道 Java面试题及答案整理(2022最新版)
4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!
觉得不错,别忘了随手点赞+转发哦!
相关文章
- 一篇运维老司机的大数据平台监控宝典(2)-联通大数据集群平台监控体系详解
- 一篇运维老司机的大数据平台监控宝典(1)-联通大数据集群平台监控体系进程详解
- 空中换引擎 博时基金数字化转型经验谈
- 如何高效地学习编程语言
- 作为一名阿里巴巴数据分析大牛,送给学弟学妹的经验积分
- 为什么要学习R语言
- Hadoop大数据分析平台的介绍性讨论
- 最全面的Spring学习笔记
- 16个用于数据科学和机器学习的顶级平台
- 给有抱负的数据科学家的六条建议
- 如何做一枚合格的数据产品经理
- 除Kaggle外,还有哪些顶级数据科学竞赛平台
- 一个鲜为人知却可以保护隐私的训练方法:联合学习
- 干货 :送你12个关于数据科学学习的关键提示(附链接)
- 大数据行业有多少种工作岗位,各自的技能需求是什么?
- 中国移动研究院常耀斌:商用大数据平台的研发之路
- 这些数据科学家必备的技能,你拥有哪些?
- 自学成才的开发者有何优势和劣势?
- Gartner报告:正处于数据科学与机器学习工具 “大爆炸”的时代
- Ready Computing借助InterSystems IRIS医疗版为医疗机构提供具有高度互操作性和可扩展性的解决方案