Java Stream forEach()和forEachOrdered()方法

时间:2020-02-23 14:36:53  来源:igfitidea点击:
  • Java Stream forEach()和forEachOrdered()是终端操作。

  • forEach()方法用于对流的每个元素执行操作。

  • 如果将forEach()方法与并行流一起使用,则不会维护遇到顺序。
    该操作将在每个元素上执行,但是它们的顺序不会固定。

  • 如果要按遇到顺序对流元素执行某些操作,则应使用forEachOrdered()方法。

  • 基础集合必须具有遇到顺序,否则forEachOrdered()将无法遵守该顺序。
    因此,将其与TreeSet或者TreeMap一起使用是没有用的。

  • forEachOrdered()操作在每个流元素上一一执行,因此它比forEach()方法要慢一些。

  • 在并行流上使用forEachOrdered()不能提供并行流的好处,因此在并行流上使用它没有多大意义。

Java Stream forEach()和forEachOrdered()方法签名

void forEach(Consumer<? super T> action)

void forEachOrdered(Consumer<? super T&GT; action);

消费者是一个功能接口。
它表示一个接受单个输入参数且不返回结果的操作。

流forEach()示例

让我们看一个简单的示例,以打印流中的所有元素。

jshell> Stream<Integer> streamNumbers = Stream.of(1, 2, 3, 4);
streamNumbers ==> java.util.stream.ReferencePipeline$Head@5a10411

jshell> streamNumbers.forEach(System.out::println);
1
2
3
4

jshell>

并行流forEach()示例

让我们看看将forEach()与并行流一起使用会发生什么。

jshell> List<Integer> list = List.of(1, 2, 3, 4, 5, 6, 7);
list ==> [1, 2, 3, 4, 5, 6, 7]

jshell> list.parallelStream().forEach(System.out::println);
5
4
1
3
2
7
6

jshell>

流forEach()示例

请注意,流元素按随机顺序获取。
当forEach()对流元素执行操作时,将不遵守元素的遇到顺序。

并行流forEachOrdered()示例

让我们看看将forEachOrdered()与列表元素的并行流一起使用会发生什么。

jshell> List<Integer> list = List.of(1, 2, 3, 4, 5, 6, 7);
list ==> [1, 2, 3, 4, 5, 6, 7]

jshell> list.parallelStream().forEachOrdered(System.out::println);
1
2
3
4
5
6
7

jshell>