Java函数式编程-9.lambda 并行操作

谁都会走 提交于 2021-01-24 01:44:12

1.什么是并行流操作?

并行流处理是jdk8提供给我们的一个新功能,本质上是一个ForkJoin框架的实现。简单讲并行流就是使用 parallelStream 方法获取并行流进行业务处理,一个典型的实例是:stream.parallel() .filter(…) .sequential() .map(…) .parallel() .reduce();其中sequential是将一个并行流转换为串行流。并行流线程数默认等于处理器的核数。

2.并行流求平均值

并行流计算平均值效率是比较高的,特别是数据量级比较大的场景下。但是如果数据量小使用stream为宜。

@Data
@ToString
@AllArgsConstructor
public class Student {
    private Long id;
    private String name;
    private Integer sexual;
    private Integer status;
    private Double mathematics;
    private Double chinese;
}

List<Student> students = Arrays.asList(
                new Student(1L,"nick1", 0, 1, 91.5, 80.0),
                new Student(2L,"nick2", 1, 1, 90.0, 85.0),
                new Student(3L,"nick3", 0, 1, 81.0, 82.0),
                new Student(4L,"nick4", 1, 0, 0.0, 0.0),
                new Student(5L,"nick5", 0, 1, 79.0, 92.0));
Double average = students.parallelStream().filter(e -> e.getStatus() > 0).mapToDouble(Student::getChinese).average().getAsDouble();

 3.并行流遍历

并行流遍历实际上是不保证顺序的,如果需要顺序遍历则需要使用forEachOrdered方法。

students.parallelStream().forEachOrdered(e->{
            System.out.println(e.getName());
        });

4.一些并行流特点

我们有时候会取流中的任何一个元素,之前在串行流中使用的findFirst现在需要使用findAny,这样可以取得更高的效率

Student any = students.parallelStream().filter(e -> e.getChinese() > 90).findAny().get();

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!