首页 > 其他分享 >Lambda 表达式中的 forEach 如何提前终止?

Lambda 表达式中的 forEach 如何提前终止?

时间:2023-02-16 21:13:10浏览次数:47  
标签:循环体 return foreach 循环 forEach 终止 表达式 Lambda

情景展示

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

执行结果如下:

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

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

原因分析

我们知道,在普通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()方法体内不能有其它代码可能会抛出的异常与自己手动抛出并捕获的异常一样;

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

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

标签:循环体,return,foreach,循环,forEach,终止,表达式,Lambda
From: https://www.cnblogs.com/zwb-19981125/p/17128319.html

相关文章

  • Quartz定时任务Cron表达式详解
    Quartz定时任务Cron表达式详解cron表达式用于配置cronTrigger的实例。cron表达式实际上是由七个子表达式组成。这些表达式之间用空格分隔。1.Seconds(秒)2.Minutes(分)3.H......
  • Lamda表达式
              ......
  • jmeter正则表达式提取器
    正则表达式提取器:允许用户从服务器的响应中通过使用perl的正则表达式提取值。该元素会作用在指定范围取样器,用正则表达式提取所需值,生成模板字符串,并将结果存储到给定的......
  • Python 高级编程之正则表达式(八)
    目录一、概述二、正则表达式语法1)字符匹配2)字符集合3)定位符4)分组1、定义分组2、引用分组3、命名分组三、Python的re模块1)re.match()方法2)re.search()方法3)re.match()......
  • Java Lambda
    JavaLambda输出符合表达式的每一个对象employees.stream().filter(p->p.getAge()>21).forEach(System.out::println);返回一个符合表达式的集合employees.st......
  • 正则 表达式,或者匹配
    例子:letreg=/(?:}\s*(\S+)\s*#)|(?:\s+(\S+)\s+)|(?:\s+(\S+)\s*#)|(?:}\s*(\S+)\s+)/g;letkeyList=[]letmatch=value.match(reg)if(match){ke......
  • 常量、变量、表达式
    (1)常量在声明时就要赋值。constabc=1234;全局变量可以在声明的同时赋值,局部变量不可以在声明时赋值,变量不可以在程序主体的begin.end之间声明。全局变量,有一个简单的区......
  • 常用正则表达式
    非空/^.+$/正整数正则(不包括0)/^[1-9]\d*$/正整数正则(包括0)/^[+]{0,1}(\d+)$/正数的正则表达式(不包括0,小数保留两位)^((0{1}.\d{1,2})|([1-9]\d.{1}\d{1,2})......
  • 【LeetCode队列#04】逆波兰表达式求值(仍然是经典的栈操作)
    逆波兰表达式求值力扣题目链接(opensnewwindow)根据逆波兰表示法,求表达式的值。有效的运算符包括+,-,*,/。每个运算对象可以是整数,也可以是另一个逆波兰表达......
  • 直播平台开发,电话号码正则表达式
    直播平台开发,电话号码正则表达式 //正则表达式letreg_tel=/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/ if(reg_tel.test(pho......