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

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

情景展示

微信图片_20220908101139.png如上图所示,我们想要终止 for 循环,使用 return。

执行结果如下:

微信图片_20220908101216.png

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

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

原因分析

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

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

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

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

我们来看看源码:

微信图片_20220908101301.png

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

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

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

解决方案

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

微信图片_20220908101309.png

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

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

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

微信图片_20220908101425.png

for 循环可以提前终止。

方式一:break

微信图片_20220908101451.png

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

微信图片_20220908101514.png

方案二:抛出异常

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

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

微信图片_20220908101531.png

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

微信图片_20220908101549.png

这样,就完美了。

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

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


相关文章
|
4月前
|
Java 编译器 API
Java Lambda表达式与函数式编程入门
Lambda表达式是Java 8引入的重要特性,简化了函数式编程的实现方式。它通过简洁的语法替代传统的匿名内部类,使代码更清晰、易读。本文深入讲解Lambda表达式的基本语法、函数式接口、方法引用等核心概念,并结合集合操作、线程处理、事件回调等实战案例,帮助开发者掌握现代Java编程技巧。同时,还解析了面试中高频出现的相关问题,助你深入理解其原理与应用场景。
|
4月前
|
安全 Java API
Java中的Lambda表达式:简洁与功能的结合
Java中的Lambda表达式:简洁与功能的结合
465 211
|
4月前
|
安全 Java
Java中的Switch表达式:更简洁的多路分支
Java中的Switch表达式:更简洁的多路分支
493 211
|
4月前
|
Java 编译器
Java 17 Switch表达式:更简洁、更强大的流程控制
Java 17 Switch表达式:更简洁、更强大的流程控制
|
5月前
|
设计模式 数据采集 Java
Java正则表达式的基础知识,进阶至熟练掌握。
通过大量的练习来熟悉它们的识别模式、如何设计模式来解决实际问题,才能够逐步达到熟练掌握。更多的是通过实践、编写代码和解决真实问题来完善技能。在这方面,没有快速的捷径,唯有刻意练习和长时间的代码实践。
116 0
|
5月前
|
自然语言处理 Java Apache
在Java中将String字符串转换为算术表达式并计算
具体的实现逻辑需要填写在 `Tokenizer`和 `ExpressionParser`类中,这里只提供了大概的框架。在实际实现时 `Tokenizer`应该提供分词逻辑,把输入的字符串转换成Token序列。而 `ExpressionParser`应当通过递归下降的方式依次解析
361 14
|
6月前
|
SQL JSON 安全
Java 8 + 中 Lambda 表达式与 Stream API 的应用解析
摘要:本文介绍了Java 8+核心新特性,包括Lambda表达式与Stream API的集合操作(如过滤统计)、函数式接口的自定义实现、Optional类的空值安全处理、接口默认方法与静态方法的扩展能力,以及Java 9模块化系统的组件管理。每个特性均配有典型应用场景和代码示例,如使用Stream统计字符串长度、Optional处理Map取值、模块化项目的依赖声明等,帮助开发者掌握现代Java的高效编程范式。(150字)
120 1

热门文章

最新文章