java 8 java.util.function.Consumer break

时间:2014-04-22 08:27:39

标签: java functional-programming java-8

for循环和foreach可以使用break指令。但是Java8 Consumer。

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

2 个答案:

答案 0 :(得分: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;
    }
  }
}

然后可以像这样使用这个辅助方法:

List<Integer> integers = Arrays.asList(1, 2, 3, 4);

forEach(
  integers,
  (i) -> {
    System.out.println(i);
    return i < 2;
  }
);

打印哪些:

1
2

答案 1 :(得分:0)

使用Streams,每个元素都应该独立查看,或者尽可能少地查看Stream中的其他项目;这部分是因为使用并行Streams的可能性。来自Stream JavaDoc的引用:

  

流管道可以顺序执行,也可以并行执行。这个   执行模式是流的属性。流已创建   初始选择顺序或并行执行。 (例如,    Collection#stream()创建一个顺序流,   和 Collection#parallelStream()创建   并行的。)这种执行模式的选择可以通过修改    Stream#sequential() Stream#parallel()方法,可以查询    Stream#isParallel()方法。

因此,在并行Stream中使用break可能会产生无法预料的后果。

如果您希望能够for或过滤流以便不需要break,那么最好的想法可能是使用传统的break循环。或者你可能必须完全重新思考你的逻辑,因为Streams提供了很多新的可能性。