2014-04-22 62 views
1

for循環和foreach可以使用break指令。但是Java8 Consumer。java 8 java.util.function.Consumer break

beans.forEach(v->{ 
    if (v.id != 100){ 
     //break or continue 
    } 
    v.doSomeThing(); 
}); 
+0

有沒有簡單的方法來做到這一點 - 你可以過濾元素或限制元素的數量,但你不能隨意破壞forEach。 – assylias

+1

如果您需要這樣的條件,那麼您在這裏使用了錯誤的工具來完成錯誤的工作,那麼只需使用常規的for-loop,尤其是當您不使用流時。 – skiwi

+0

@Holame'forEach'中的'continue'基本上只是對否定進行過濾,所以你可以像'beans.stream()。filter(v - > v.id == 100).forEach(v - > v.doSomeThing())'。 –

回答

1

這本來是不錯的,從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 
0

有了Streams,每個元素都應該獨立查看或儘可能少地瞭解Stream中的其他項;這部分是因爲使用並行流的可能性。來自Stream JavaDoc的報價:

流式管道可以按順序或並行執行。這個 執行模式是流的一個屬性。流創建 與連續或並行執行的初始選擇。 (例如, 集合#流()創建順序流, 和集合#parallelStream()創建 平行之一。)的執行模式的這種選擇可以由 流#順序被修改()Stream#parallel()方法,可能會用 查詢Stream#isParallel()方法。

因此,在並行流中使用break可能會產生無法預料的後果。

如果您希望能夠break或過濾流以便不需要break,最好的想法可能是使用傳統的for環回。或者,也許你必須完全重新思考你的邏輯,因爲Streams提供了很多新的可能性。