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())'。 –