面试官:Lambda 表达式中的 forEach 如何提前终止?这次被问倒了!

简介: 面试官:Lambda 表达式中的 forEach 如何提前终止?这次被问倒了!

情景展示


image.png


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


执行结果如下:


image.png


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


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


推荐一个开源免费的 Spring Boot 最全教程:


https://github.com/javastacks/spring-boot-best-practice


原因分析


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


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


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


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


我们来看看源码:


image.png


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


java8的forEach()和JavaScript的forEach()用法是何其的相似,感兴趣的可以去了解下(在文末)。


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


解决方案


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


image.png


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


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


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


image.png


for循环可以提前终止。


方式一:break


image.png


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


image.png


方案二:抛出异常


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


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


image.png


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


image.png


这样,就完美了。


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


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


来源:https://blog.csdn.net/weixin_39597399



相关文章
|
2月前
|
消息中间件 Java 编译器
面试官:说说Lambda表达式底层原理?
面试官:说说Lambda表达式底层原理?
36 3
面试官:说说Lambda表达式底层原理?
|
4月前
|
Android开发 Kotlin
Android经典面试题之Kotlin中Lambda表达式有哪些用法
Kotlin的Lambda表达式是匿名函数的简洁形式,常用于集合操作和高阶函数。基本语法是`{参数 -> 表达式}`。例如,`{a, b -> a + b}`是一个加法lambda。它们可在`map`、`filter`等函数中使用,也可作为参数传递。单参数时可使用`it`关键字,如`list.map { it * 2 }`。类型推断简化了类型声明。
27 0
|
4月前
|
Android开发 Kotlin
Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
**Kotlin中的匿名函数与Lambda表达式概述:** 匿名函数(`fun`关键字,明确返回类型,支持非局部返回)适合复杂逻辑,而Lambda(简洁语法,类型推断)常用于内联操作和高阶函数参数。两者在语法、返回类型和使用场景上有所区别,但都提供无名函数的能力。
34 0
|
4月前
|
Java API
Java面试题:说明Lambda表达式在Java中的应用,以及函数式接口的概念和作用。
Java面试题:说明Lambda表达式在Java中的应用,以及函数式接口的概念和作用。
36 0
|
6月前
|
前端开发 JavaScript
【面试题】 JavaScript中高级语法--?? 表达式 的作用
【面试题】 JavaScript中高级语法--?? 表达式 的作用
|
6月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_109 计算布尔表达式的值
「SQL面试题库」 No_109 计算布尔表达式的值
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
11天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
12天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
38 4
|
1月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
69 2