This question already has answers here:
forEach vs forEachOrdered in Java 8 Stream
(3个答案)
2年前关闭。
据我所知,并行流中的,
不幸的是,此时我在Java 8方面的实际经验还很有限,因此,如果有人可以向我解释此体系结构决策的原因,也许我会很感激,也许可以通过一些简单的示例/用例向我展示否则可能会出错。
只是为了清楚起见,我并不是在问这个问题:forEach vs forEachOrdered in Java 8 Stream。我完全知道这些方法如何工作以及它们之间的差异。我要问的是Oracle做出体系结构决策的实际原因。
在这种情况下,建议不要以任何顺序打印元素,因此在此处强制使用
在这种情况下,您想强制执行
为简化起见,定义了两种方法,明确规定了它们的作用。例如,这与
(3个答案)
2年前关闭。
据我所知,并行流中的,
findFirst
,skip
,limit
等方法都可以保持其行为,只要流是有序的(默认情况下)是否为并行。所以我想知道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
只是没有用;但这意味着在内部对流的源进行其他测试。这可能会变得非常棘手和复杂(因为它已经是顺便说一句了)。为简化起见,定义了两种方法,明确规定了它们的作用。例如,这与
findFirst
与findAny
甚至Optional::isPresent
和Optional::isEmpty
(在Java-11中添加)相当。07-23 19:46