This question already has answers here:
forEach vs forEachOrdered in Java 8 Stream

(3个答案)


2年前关闭。




据我所知,并行流中的findFirstskiplimit等方法都可以保持其行为,只要流是有序的(默认情况下)是否为并行。所以我想知道forEach方法为什么不同。我考虑了一下,但我只是不明白定义forEachOrdered方法的必要性,这是使默认设置forEach更加容易和令人惊讶,然后在流实例上调用unordered就是这样,无需定义新方法。

不幸的是,此时我在Java 8方面的实际经验还很有限,因此,如果有人可以向我解释此体系结构决策的原因,也许我会很感激,也许可以通过一些简单的示例/用例向我展示否则可能会出错。

只是为了清楚起见,我并不是在问这个问题:forEach vs forEachOrdered in Java 8 Stream。我完全知道这些方法如何工作以及它们之间的差异。我要问的是Oracle做出体系结构决策的实际原因。

最佳答案

定义保留顺序的forEach方法和破坏顺序的unordered会使IMO复杂化;仅仅是因为unordered只是在流api内部设置了一个标志而已,并且标志检查必须根据某些条件执行或强制执行。

因此,假设您会这样做:

someStream()
      .unordered()
      .forEach(System.out::println)

在这种情况下,建议不要以任何顺序打印元素,因此在此处强制使用unordered。但是,如果我们这样做:
someSet().stream()
         .unordered()
         .forEach(System.out::println)

在这种情况下,您想强制执行unordered吗?毕竟,流的源是Set,它没有顺序,因此在这种情况下,强制unordered只是没有用;但这意味着在内部对流的源进行其他测试。这可能会变得非常棘手和复杂(因为它已经是顺便说一句了)。

为简化起见,定义了两种方法,明确规定了它们的作用。例如,这与findFirstfindAny甚至Optional::isPresentOptional::isEmpty(在Java-11中添加)相当。

07-23 19:46