在lambda的foreach遍历中break退出操作(lambda foreach break)

前言

Q: 当我们需要在lambda的遍历循环中返回或者退出,应该怎么办?

A: 在lambda的foreach中是不能用break的,这相当不人性化。但是别忘了,用回默认的forEach遍历是可以的。

>>>When using external iteration over an Iterable we use break or return from enhanced for-each loop as:\

//by zhengkai.blog.csdn.net
for (SomeObject obj : someObjects) {
 if (some_condition_met) {
 break; // or return obj
 }
}

>>>How can we break or return using the internal iteration in a Java 8 lambda expression like:

someObjects.forEach(obj -> {
 //what to do here?
})

Solution解决方案

>>> 解决方案呢,分几种:

使用正常的forEach循环,判断并break=.=

使用return,return到该主方法的object(测试发现,如果是void,无法使用 return; 返回)。

使用exception,直接throw出来,然后后面try一下(一般不建议这样把)。

使用anyMatch/findAny/findFirst等,只match/find需要用到的条件。

使用JAVA9的takewhile,使用一个MutableBoolean来做判断条件,需要break则setFalse即可。

使用rxJava的takewhile和IntStream

takewhile(JAVA9)

>>> 理解为while(true)即可。

MutableBoolean ongoing = MutableBoolean.of(true);
someobjects.stream()...takeWhile(t -> ongoing.value()).forEach(t -> {
 // doing something.
 if (...) { // want to break;
 ongoing.setFalse();
 }
});

takewhile(rxJava)

 IntStream intStream = IntStream.range(1,10000000);
 Observable.from(() -> intStream.iterator())
 .takeWhile(n -> n < 10)
 .forEach(n-> System.out.println(n));

exception

>>> 总之我也不是很喜欢这样写,但是他确实可以,抛出一个继承自RuntimeException的BreakException的错即可。

>>> The code will be something like this - I cannot say I like it but it works. You create your own class BreakException which extends RuntimeException。

try {
 someObjects.forEach(obj -> {
 // some useful code here
 if(some_exceptional_condition_met) {
 throw new BreakException();
 }
 }
}
catch (BreakException e) {
 // here you know that your condition has been met at least once
}

findAny

>>> 为了在并行操作中获得最大性能,请使用与findFirst()类似的findAny()。 但是,如果需要稳定的结果,请改用findFirst()。 另外请注意,匹配模式的(anyMatch()/allMatch())是返回布尔值true或false,而不是返回对象,所以无法直接获得匹配的对象。

>>> For maximal performance in parallel operations use findAny() which is similar to findFirst(). However If a stable result is desired, use findFirst() instead. Also note that matching patterns (anyMatch()/allMatch) will return only boolean, you will not get matched object.

Optional<SomeObject> result =

someObjects.stream().filter(obj -> some_condition_met).findAny();

整理出处:https://stackoverflow.com/questions/23308193/break-or-return-from-java-8-stream-foreach

补充知识:在Java8的foreach()中使用return/break/continue

今天使用lambda表达式处理集合时,发现对return、break以及continue的使用有点迷惑,于是自己动手测试了一下,才发现在使用foreach()处理集合时不能使用break和continue这两个方法,也就是说不能按照普通的for循环遍历集合时那样根据条件来中止遍历,而如果要实现在普通for循环中的效果时,可以使用return来达到,也就是说如果你在一个方法的lambda表达式中使用return时,这个方法是不会返回的,而只是执行下一次遍历,看如下的测试代码:

List<String> list = Arrays.asList("123", "45634", "7892", "abch", "sdfhrthj", "mvkd");
list.stream().forEach(e ->{
 if(e.length() >= 5){
 return;
 }
 System.out.println(e);
});

上述代码的输出结果是如下图所示:

可以看出return起到的作用和continue是相同的。

想知道这是为什么,在Stack Overflow中找到一个答案,主要是说foreach()不是一个循环,不是设计为可以用break以及continue来中止的操作。

针对问题:

1、foreach()循环操作元素时,是否会退出lambda表达式,如下图所示:

不管你遍历到哪个集合中的元素,上图都会停在第一行程序中而不会发生跳转,所以是不会停止lambda表达式的执行的。

以上这篇在lambda的foreach遍历中break退出操作(lambda foreach break)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java 实现通过 post 方式提交json参数操作

    由于所爬取的网站需要验证码,通过网页的开发人员工具[F12]及在线http post,get接口测试请求工具(http://coolaf.com/)发现访问时加上请求头header 信息时可以跳过验证码校验. 而且该网站只接受post请求,对提交的参数也只接受json格式,否则请求失败. 现将通过 post 方式提交json参数的方法记录如下: import java.io.UnsupportedEncodingException; import java.net.URI; import jav

  • Map 使用 Lambda 的 forEach 实现跳出循环操作

    Lambda 的 forEach表达式用起来很爽啊,最近开发中用来遍历了一下Map,结果就翻车了......大致场景如下: public static void main(String[] args) { HashMap<String,String> map = new HashMap<>(); map.put("1","001"); map.put("2","002"); map.put("

  • Java 8跳过本次循环,继续执行以及跳出循环,终止循环的代码实例

    在Java8之前,最开始使用for i 循环,很老旧,后来有了高级的for each 循环,然后这个跳出本次循环和跳出所有的for循环,都简单,稍微没见过的就是跳出多层for循环. 然后就是Java8出的foreach循环,这个循环里面,break和continue都不管用啦.需要使用return,这个只能跳过本次循环,还是会继续执行for循环的,那么怎么跳出这个Java8的foreach循环呢? 下面对所有的循环,都来了一次操作. 看看如何,跳出当前循环,继续执行:或者直接跳出for循环:或者

  • java8 forEach结合Lambda表达式遍历 List操作

    我就废话不多说了,大家还是直接看代码吧~ @Test void testJava8ForeachMap() { Map<String, Integer> items = new HashMap<>(); items.put("A", 10); items.put("B", 20); items.put("C", 30); items.put("D", 40); items.put("E&quo

  • 在lambda的foreach遍历中break退出操作(lambda foreach break)

    前言 Q: 当我们需要在lambda的遍历循环中返回或者退出,应该怎么办? A: 在lambda的foreach中是不能用break的,这相当不人性化.但是别忘了,用回默认的forEach遍历是可以的. >>>When using external iteration over an Iterable we use break or return from enhanced for-each loop as:\ //by zhengkai.blog.csdn.net for (SomeO

  • 深入理解C#中foreach遍历的使用方法

    前言 本文主要给大家介绍了关于C#中foreach遍历的用法以及c#使用foreach需要知道的一些事,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 一.C#中foreach遍历用法 foreach循环用于列举出集合中所有的元素,foreach语句中的表达式由关键字in隔开的两个项组成.in右边的项是集合名,in左边的项是变量名,用来存放该集合中的每个元素. 该循环的运行过程如下:每一次循环时,从集合中取出一个新的元素值.放到只读变量中去,如果括号中的整个表达式返回值为true

  • php中foreach遍历类对象的总结

    foreach 遍历数组很常见,同样foreach也可以遍历对象 做如下测试: class my { public $a = 'a'; protected $b = 'b'; private $c = 'c'; private $data = array('fantasy','windows','linux'); // 内部foreach遍历class function traversable() { foreach($this as $key=>$val) { echo $key.'=>';

  • ASP.NET中GridView、DataList、DataGrid三个数据控件foreach遍历用法示例

    本文实例讲述了ASP.NET中GridView.DataList.DataGrid三个数据控件foreach遍历用法.分享给大家供大家参考,具体如下: //gridview遍历如下: foreach (GridViewRow row in GridView1.Rows) { CheckBox cb = (CheckBox)row.FindControl("CheckBox2"); if (cb.Checked == true) { } } //datagrid遍历: foreach (

  • PHP中使用foreach()遍历二维数组的简单实例

    第一种类型 想用foreach()遍历整个二维数组: $team = array('lk','ok'); $book = array('linux服务器配置与管理',$team); foreach($book as $k=>$val) //for $book each $value( as ) echo $k.'=>'.$val.''; 输出结果是: 0=>linux服务器配置与管理 1=>Array 当然,其实我是想要所有具体内容,而不是输出array... 所以应该采用如下做法

  • JSP中c:foreach遍历和s:iterator遍历异同实例分析

    本文实例分析了JSP中c:foreach遍历和s:iterator遍历的异同.分享给大家供大家参考.具体如下: ①jstl c:foreach 首先我们来看一个普通的servlet: import com.xy.entity.Board; import com.xy.entity.Topic; import com.xy.entity.User; public class ToMainAction extends HttpServlet { private IBoarderDao boardDa

  • JS数组遍历中for,for in,for of,map,forEach各自的使用方法与优缺点

    JS数组遍历普通函数 优点:支持流程控制(break.continue.return) for const arr = ["A", "B", "C"] for(let i = 0; i<arr.length; i++){ console.log(arr[i]) } 优点:能够对索引精确控制缺点:语法较为繁琐 for in const arr = ["A","B","C"] arr[

  • JavaScript forEach()遍历函数使用及介绍

    forEach()函数从头到尾把数组遍历一遍.有三个参数分别是:数组元素,元素的索引,数组本身(如果是一个参数就是数组元素,也就是数组的值. var data=[1,2,3,4,5,6]; var sum=0; data.forEach(function(v){//其中的v就是数组的值 123456 sum+=v;}) document.write(sum+"<br>");//打印出来是21 data.forEach(function(o,p,q){//分别对应:数组元素,

  • mybatis3.4.6 批量更新 foreach 遍历map 的正确姿势详解

    好久没编码了!最近开始编码遇到一个问题 !一个批量修改的问题,就是mybatis foreach 的使用. 当时使用的场景 ,前端 传逗号拼接的字符串id, 修改id对应数据的数据顺序 ,顺序 就是id 的顺序. 就是一个条件(单个id值) 修改一个值(传入的id的顺序) , 1. 把条件作为Map 的key 修改值是value,用map入参 2.用List<Object> 或者数组 ,把条件和值封装成对象放进list集合或者array数组 3.代码使用for循环调用mapper方法 穿两个参

  • Spring MVC使用jstl 标签c:forEach 遍历输出双层嵌套List的数据方式

    目录 Spring MVC jstl 标签c:forEach 遍历输出双层嵌套List数据 1.创建Controller 2.创建对应的jsp页面 注意事项: springMVC的forEach不能正常显示 1.问题 2.解决 Spring MVC jstl 标签c:forEach 遍历输出双层嵌套List数据 具体操作步骤如下: 1.创建Controller import java.util.ArrayList; import java.util.List; import javax.serv

随机推荐