Stream 提供的遍历方法有两个,一个是 foreach
,一个是 foreachOrdered
。当然,foreach
方法在集合中也存在,相信大家在以前的编码过程中或多或少都有用到过。
方法定义
void forEach(Consumer<? super T> action);
void forEachOrdered(Consumer<? super T> action);
两个方法从使用上来讲都是一样的,具体区别是,在并行流遍历时,由于流元素是多线程在处理,foreach
无法保证处理的顺序,而 foreachOrdered
可以保证处理的顺序。
使用举例
1 | public void foreachTest() { |
输出结果如下:
原始顺序
this is foreachTest串行流的 foreach
main:this
main:is
main:foreachTest并行流的 foreach
main:is
ForkJoinPool.commonPool-worker-2:foreachTest
ForkJoinPool.commonPool-worker-1:this串行流的 foreachOrdered
main:this
main:is
main:foreachTest并行流的 foreachOrdered
ForkJoinPool.commonPool-worker-3:this
main:is
main:foreachTest
可以看出,串行流时,两种方法的输出是一致,且顺序都是原始顺序,执行线程是主线程;并行流时,foreach
无法保证输出顺序,而 foreachOrdered
可以保证输出顺序,执行线程有些是线程池的。
总结
foreach
和foreachOrdered
在串行流处理时,结果是一样的。- 并行流时,
foreach
处理的顺序有可能是乱序的,foreachOrdered
处理的顺序是按照流元素的顺序。 - 并行流时,如果对处理顺序无要求,使用
foreachOrdered
效率会更高一些。