在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
相關文章
- javascript forEach無法break,使用every代替JavaScript
- jstl forEach遍歷JS
- 在Java8的foreach()中不能break,如果需要continue時,可以使用returnJava
- Qt foreach關鍵字遍歷容器QT
- React中兩種遍歷資料的方法(map、forEach)React
- 利用c:forEach標籤遍歷陣列陣列
- Java Lambda表示式forEach無法跳出迴圈的解決思路Java
- 遍歷陣列的常用方法forEach,filter,map等陣列Filter
- JavaScript 的 4 種陣列遍歷方法: for VS forEach() VS for/in VS for/ofJavaScript陣列
- foreach 實現 MyBatis 遍歷集合與批量運算元據MyBatis
- JavaScript中foreachJavaScript
- Mybatis中foreach的使用MyBatis
- php中foreach的使用PHP
- JS中陣列遍歷方法foreach,filter,some,every,map方法介紹與總結JS陣列Filter
- PHP 中的 foreach 工作原理PHP
- python中break和continue的區別Python
- 什麼是 bootstrap 中的 break pointboot
- 對比JavaScript中的Continue和BreakJavaScript
- break,continue,gotoGo
- break語句
- JAVA中的foreach怎麼用Java
- Iterator & foreach
- foreach陷阱
- JavaScript forEach()JavaScript
- java中switch語句注意--breakJava
- JAVA中的跳轉語句—break、continueJava
- foreach使用引用時的一個坑-foreach原始碼分析原始碼
- CSS word-breakCSS
- 139. Word Break
- continue、break與gotoGo
- 使用 Lambda Web Adapter 在 Lambda 上 構建 web 應用WebAPT
- powershell中的where和foreach比較
- 關於遍歷,看這篇文章就足夠了【find()、findIndex()、forEach()、splice()、slice()詳解】Index
- Map forEach() 方法
- forEach與map
- Java 中的 Lambda 表示式Java
- javascript中break和continue的區別和作用JavaScript
- 關於在forEach中使用await的問題AI