在lambda的foreach遍历中break退出操作(lambda foreach break)
前言
Q:当我们需要在lambda的遍历循环中返回或者退出,应该怎么办?
A:在lambda的foreach中是不能用break的,这相当不人性化。但是别忘了,用回默认的forEach遍历是可以的。
>>>WhenusingexternaliterationoveranIterableweusebreakorreturnfromenhancedfor-eachloopas:\
//byzhengkai.blog.csdn.net for(SomeObjectobj:someObjects){ if(some_condition_met){ break;//orreturnobj } }
>>>HowcanwebreakorreturnusingtheinternaliterationinaJava8lambdaexpressionlike:
someObjects.forEach(obj->{ //whattodohere? })
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)即可。
MutableBooleanongoing=MutableBoolean.of(true); someobjects.stream()...takeWhile(t->ongoing.value()).forEach(t->{ //doingsomething. if(...){//wanttobreak; ongoing.setFalse(); } });
takewhile(rxJava)
IntStreamintStream=IntStream.range(1,10000000); Observable.from(()->intStream.iterator()) .takeWhile(n->n<10) .forEach(n->System.out.println(n));
exception
>>>总之我也不是很喜欢这样写,但是他确实可以,抛出一个继承自RuntimeException的BreakException的错即可。
>>>Thecodewillbesomethinglikethis-IcannotsayIlikeitbutitworks.YoucreateyourownclassBreakExceptionwhichextendsRuntimeException。
try{ someObjects.forEach(obj->{ //someusefulcodehere if(some_exceptional_condition_met){ thrownewBreakException(); } } } catch(BreakExceptione){ //hereyouknowthatyourconditionhasbeenmetatleastonce }
findAny
>>>为了在并行操作中获得最大性能,请使用与findFirst()类似的findAny()。但是,如果需要稳定的结果,请改用findFirst()。另外请注意,匹配模式的(anyMatch()/allMatch())是返回布尔值true或false,而不是返回对象,所以无法直接获得匹配的对象。
>>>FormaximalperformanceinparalleloperationsusefindAny()whichissimilartofindFirst().HoweverIfastableresultisdesired,usefindFirst()instead.Alsonotethatmatchingpatterns(anyMatch()/allMatch)willreturnonlyboolean,youwillnotgetmatchedobject.
Optional
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时,这个方法是不会返回的,而只是执行下一次遍历,看如下的测试代码:
Listlist=Arrays.asList("123","45634","7892","abch","sdfhrthj","mvkd"); list.stream().forEach(e->{ if(e.length()>=5){ return; } System.out.println(e); });
上述代码的输出结果是如下图所示:
可以看出return起到的作用和continue是相同的。
想知道这是为什么,在StackOverflow中找到一个答案,主要是说foreach()不是一个循环,不是设计为可以用break以及continue来中止的操作。
针对问题:
1、foreach()循环操作元素时,是否会退出lambda表达式,如下图所示:
不管你遍历到哪个集合中的元素,上图都会停在第一行程序中而不会发生跳转,所以是不会停止lambda表达式的执行的。
以上这篇在lambda的foreach遍历中break退出操作(lambdaforeachbreak)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。