Java Stream forEachOrdered() 示例

示例: 迭代整数流并将数据打印到控制台

List<Integer> list = Arrays.asList(2, 4, 6, 8, 10); 
list.stream()
    .forEachOrdered( System.out::println );
	
// 倒序排序
list.stream()
	.sorted(Comparator.reverseOrder())
	.forEachOrdered(System.out::println);
Java Stream forEachOrdered(action) 方法

Java Stream forEachOrdered(action) 方法用于迭代给定 Stream 的所有元素,并对 Stream 的每个元素执行 Consumer操作,如果 Stream 具有定义的遇到顺序(encounter order),则按照 Stream 的遇到顺序。

(简单来说,遇到顺序(encounter order) 就是一个在Stream中遇到数据的顺序)

Stream forEachOrdered() 方法

方法语法

forEachOrdered()方法语法如下:

void forEachOrdered(Consumer<? super T> action)

Consumer是一个函数式接口(functional interface),action表示要对流中的每个元素执行的非干扰操作。

说明

  • forEachOrdered()方法是一个终端操作。这意味着它不会返回类型为 Stream的输出。
  • 执行 forEachOrdered() 后,流管道被视为已消耗,不能再使用。
  • 如果我们需要再次遍历同一个数据源,就必须返回数据源获取新的流。
  • 如果流具有定义的遇到顺序,则按照流的遇到顺序对此流的每个元素执行“操作”。
  • 为一个元素“happens-before”执行操作,为后续元素执行“action”。但是对于任何给定的元素,action可以在库选择的任何 Thread中执行。
www. On IT Road .com

Stream的 forEach() 方法与 forEachOrdered()方法比较

forEach() 操作的行为是明确的非确定性的。

对于并行流,forEach()操作不保证遵守流的遇到顺序(encounter order)。

如果流具有定义的遇到顺序,则 forEachOrdered() 操作尊重流的遇到顺序。
这种行为适用于并行流和顺序流。

如果我们将 forEachOrdered()与并行流一起使用,我们可能会失去并行性的好处。

示例:迭代整数的stream,并检查stream 的 encounter order

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
日期:2020-09-17 00:10:05 来源:oir作者:oir