Java Stream : forEachOrdered() 与forEach()比较

x33g5p2x  于2022-09-25 转载在 Java  
字(1.3k)|赞(0)|评价(0)|浏览(552)

在本文中,我们将提供 Stream.forEachOrdered()Stream.forEach() 方法之间的区别。两种方法都以 Consumer 的形式执行操作。 forEachOrdered()forEach() 方法之间的区别在于 forEachOrdered() 将始终按照流中元素的遇到顺序执行给定的操作,而 forEach() 方法是不确定的。在并行流中,forEach() 方法可能不一定遵守顺序,而 forEachOrdered() 将始终遵守顺序。在顺序流中,两种方法都尊重顺序。所以我们应该使用 forEachOrdered() 方法,如果我们希望在每种情况下都按照遇到的顺序执行操作,无论流是顺序的还是并行的。如果流是顺序的,我们可以使用任何方法来尊重顺序。但是如果流也可以并行,那么我们应该使用 forEachOrdered() 方法来保障顺序。

Stream.forEach()

找到 forEach 方法声明。

void forEach(Consumer<? super T> action)

1. 为此流的每个元素执行 Consumer 操作。
2. 这是终端操作。
3. 此操作的行为是不确定的。
4. 在并行操作中,此方法不保证尊重遇到顺序。

Stream.forEachOrdered()

找到 forEachOrdered 方法声明。

void forEachOrdered(Consumer<? super T> action)

1. 如果流具有已定义的遇到顺序,则按此流的遇到顺序对此流的每个元素执行 Consumer 操作。
2. 这是终端操作。
3. 此方法保证遵守顺序流和并行流中的相遇顺序。

使用顺序流

在顺序流 forEachforEachOrdered 中,这两种方法都将按照遇到的顺序执行操作。
找到 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。

相关文章

微信公众号

最新文章

更多