stream中forEach和forEachOrdered使用和区别
Posted 泡^泡
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stream中forEach和forEachOrdered使用和区别相关的知识,希望对你有一定的参考价值。
测试例子
package com;
import java.util.stream.Stream;
public class App
public static void main( String[] args )
Stream.of("张三,","李四,","王五,","马六,").parallel().forEach(System.out::print);
System.out.println("\\n______________________________________________");
Stream.of("张三,","李四,","王五,","马六,").parallel().forEachOrdered(System.out::print);
System.out.println("\\n______________________________________________");
Stream.of("张三,","李四,","王五,","马六,").parallel().forEachOrdered(System.out::print);
首先对forEach来说,当stream为parallel的时候,它是并行处理多线程的,所以不能保证输出数据的顺序,但是处理数据的效率比较高。操作共享变量的时候,需要考虑线程安全的问题。
错误案例
package com;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class App
public static void main( String[] args )
List<Integer> list = new ArrayList<>();
IntStream.range(0,10000).parallel().forEach(item->list.add(item));
代码修正
package com;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class App
public static void main( String[] args )
List<Integer> list = new ArrayList<>();
IntStream.range(0,10000).parallel().forEachOrdered(item->list.add(item));
对于使用forEachOrdeed ,当stream 为parallel的时候,虽然是多个线程并行处理的。但是还是会按照他source原有的顺序输出的,底层是通过happensbefore原则保证了它的内存可见性。
以上是关于stream中forEach和forEachOrdered使用和区别的主要内容,如果未能解决你的问题,请参考以下文章
Stream forEachOrdered() vs forEach()
Stream forEachOrdered() vs forEach()
Java8,stream().map().collect(Collectors.toList()).forEach()和stream().map().forEach()有什么区别?