2014-04-22 121 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提供了很多新的可能性。