【问题标题】:java 8 java.util.function.Consumer break [duplicate]java 8 java.util.function.Consumer中断[重复]
【发布时间】:2014-06-06 12:23:50
【问题描述】:

for 循环和 foreach 可以使用 break 指令。而是 Java8 消费者。

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

【问题讨论】:

  • 没有简单的方法可以做到这一点 - 你可以过滤元素或限制元素的数量,但你不能轻易地在随机条件下破坏 forEach。
  • 您在这里使用了错误的工具来完成错误的工作,如果您需要这样的条件,那么只需使用常规的 for 循环,尤其是当您不使用流时。
  • @Holame A continueforEach 中基本上只是过滤否定,所以你可以做类似beans.stream().filter(v -> v.id == 100).forEach(v -> v.doSomeThing()) 的事情。
  • @StuartMarks 确实 - 您可以将问题作为另一个问题的副本关闭,两个链接都将出现在关闭原因中。

标签: java functional-programming java-8


【解决方案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

【讨论】:

    【解决方案2】:

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

    流管道可以按顺序或并行执行。这 执行模式是流的一个属性。创建流 初始选择顺序或并行执行。 (例如, Collection#stream() 创建一个顺序流, Collection#parallelStream() 创建 一个并行的。)这种执行模式的选择可以由 Stream#sequential()Stream#parallel() 方法,并且可以使用 Stream#isParallel() 方法。

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

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

    【讨论】:

      猜你喜欢
      • 2016-07-26
      • 2014-07-22
      • 2023-03-23
      • 1970-01-01
      • 2018-09-27
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多