for循環和foreach可以使用break指令。但是Java8 Consumer。java 8 java.util.function.Consumer break
beans.forEach(v->{
if (v.id != 100){
//break or continue
}
v.doSomeThing();
});
for循環和foreach可以使用break指令。但是Java8 Consumer。java 8 java.util.function.Consumer break
beans.forEach(v->{
if (v.id != 100){
//break or continue
}
v.doSomeThing();
});
這本來是不錯的,從Java中8輔助方法逃脫,但如果你真的需要一個循環來打破(過濾或設置限制爲@assylias建議,是爲了避免這種方式)然後只寫一個輔助方法:
public static <T> void forEach(Iterable<T> iterable, Function<T, Boolean> f)
{
for (T item : iterable)
{
if (!f.apply(item))
{
break;
}
}
}
這helper方法就可以這樣使用:
List<Integer> integers = Arrays.asList(1, 2, 3, 4);
forEach(
integers,
(i) -> {
System.out.println(i);
return i < 2;
}
);
它打印:
1
2
有了Streams,每個元素都應該獨立查看或儘可能少地瞭解Stream中的其他項;這部分是因爲使用並行流的可能性。來自Stream JavaDoc的報價:
流式管道可以按順序或並行執行。這個 執行模式是流的一個屬性。流創建 與連續或並行執行的初始選擇。 (例如, 集合#流()創建順序流, 和集合#parallelStream()創建 平行之一。)的執行模式的這種選擇可以由 流#順序被修改()或Stream#parallel()方法,可能會用 查詢Stream#isParallel()方法。
因此,在並行流中使用break
可能會產生無法預料的後果。
如果您希望能夠break
或過濾流以便不需要break
,最好的想法可能是使用傳統的for
環回。或者,也許你必須完全重新思考你的邏輯,因爲Streams提供了很多新的可能性。
有沒有簡單的方法來做到這一點 - 你可以過濾元素或限制元素的數量,但你不能隨意破壞forEach。 – assylias
如果您需要這樣的條件,那麼您在這裏使用了錯誤的工具來完成錯誤的工作,那麼只需使用常規的for-loop,尤其是當您不使用流時。 – skiwi
@Holame'forEach'中的'continue'基本上只是對否定進行過濾,所以你可以像'beans.stream()。filter(v - > v.id == 100).forEach(v - > v.doSomeThing())'。 –