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) 方法用于迭代给定 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