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()

Laravel Blade 模板 @foreach 订单

Java8,stream().map().collect(Collectors.toList()).forEach()和stream().map().forEach()有什么区别?

将 forEachOrdered 与并行流一起使用的好处

关于 stream( ) 或 forEach() 为什么不能用如continue和break,如何替代