文
章
目
录
章
目
录
Stream forEachOrdered() 方法用于遍历给定 Stream 中的所有元素,并在遇到 Stream 的顺序上对 Stream 中的每个元素执行 Consumer 操作。如果 Stream 具有定义的遇到顺序,则在遇到 Stream 的顺序上执行操作。
1.Stream forEachOrdered() 方法
1.1方法语法
forEachOrdered() 方法语法如下:
void forEachOrdered(Consumer<? super T> action)
这里 Consumer 是一个函数式接口,表示要在流中的每个元素上执行的非干扰操作。
1.2描述
- forEachOrdered() 方法是一个终端操作,这意味着它不返回类型为 Stream 的输出。
- 执行 forEachOrdered() 后,流管道被视为已消耗,不能再使用。
- 如果我们需要再次遍历相同的数据源,必须返回数据源以获取新的流。
- 对于此流中的每个元素,如果流具有定义的遇到顺序,则按遇到顺序执行操作。
- 对一个元素执行的操作在对后续元素执行操作之前发生。但对于任何给定的元素,该操作可能在库选择的任何线程中执行。
2.Stream forEach() vs forEachOrdered()
forEach() 操作的行为是显式非确定的。对于并行流,forEach() 操作不能保证遵守流的遇到顺序。
而 forEachOrdered() 操作如果流具有定义的遇到顺序,则尊重流的遇到顺序。这种行为对于并行流和顺序流都适用。
如果我们使用 forEachOrdered() 与并行流一起使用,可能会失去并行性的优势。
让我们通过一个 Java 程序来理解,该程序遍历整数流并验证遇到顺序。
List<Integer> list = Arrays.asList(2, 4, 6, 8, 10);
list.stream().parallel().forEach( System.out::println ); //1
list.stream().parallel().forEachOrdered( System.out::println ); //2
现在,让我们比较这两个语句的输出:
//forEach()
6
10
8
4
2
//forEachOrdered()
2
4
6
8
10
3.Stream forEachOrdered() 示例
示例 1:Java 程序遍历整数流并将其打印到控制台
List<Integer> list = Arrays.asList(2, 4, 6, 8, 10);
list.stream()
.forEachOrdered( System.out::println );
输出:
2
4
6
8
10
示例2:Java程序以相反顺序迭代整数流
List<Integer> list = Arrays.asList(2, 4, 6, 8, 10);
list.stream()
.sorted(Comparator.reverseOrder())
.forEachOrdered(System.out::println);
输出:
10
8
6
4
2