在本文中,我们将提供 Stream.forEachOrdered()
和 Stream.forEach()
方法之间的区别。两种方法都以 Consumer
的形式执行操作。 forEachOrdered()
和 forEach()
方法之间的区别在于 forEachOrdered()
将始终按照流中元素的遇到顺序执行给定的操作,而 forEach()
方法是不确定的。在并行流中,forEach()
方法可能不一定遵守顺序,而 forEachOrdered()
将始终遵守顺序。在顺序流中,两种方法都尊重顺序。所以我们应该使用 forEachOrdered()
方法,如果我们希望在每种情况下都按照遇到的顺序执行操作,无论流是顺序的还是并行的。如果流是顺序的,我们可以使用任何方法来尊重顺序。但是如果流也可以并行,那么我们应该使用 forEachOrdered()
方法来保障顺序。
找到 forEach
方法声明。
void forEach(Consumer<? super T> action)
1. 为此流的每个元素执行 Consumer
操作。
2. 这是终端操作。
3. 此操作的行为是不确定的。
4. 在并行操作中,此方法不保证尊重遇到顺序。
找到 forEachOrdered
方法声明。
void forEachOrdered(Consumer<? super T> action)
1. 如果流具有已定义的遇到顺序,则按此流的遇到顺序对此流的每个元素执行 Consumer
操作。
2. 这是终端操作。
3. 此方法保证遵守顺序流和并行流中的相遇顺序。
在顺序流 forEach
和 forEachOrdered
中,这两种方法都将按照遇到的顺序执行操作。
找到 forEach
方法的代码。
Stream.of("A","B","C", "D")
.forEach(e -> System.out.println(e));
输出是 A B C D。
找到 forEachOrdered
方法的代码。
Stream.of("A","B","C", "D")
.forEachOrdered(e -> System.out.println(e));
输出是 A B C D。
如果顺序很重要,最好始终使用 forEachOrdered
方法。
并行流 forEach
不保证遇到顺序。
Stream.of("A","B","C", "D")
.parallel()
.forEach(e -> System.out.println(e));
输出可以是C B A D。输出不一定是遇到顺序。
forEachOrdered
方法始终保证相遇顺序。
Stream.of("A","B","C", "D")
.parallel()
.forEachOrdered(e -> System.out.println(e));
输出是 A B C D。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.concretepage.com/java/java-8/java-stream-foreachordered-vs-foreach
内容来源于网络,如有侵权,请联系作者删除!