Lambda元素规约

规约:大致可以理解为将一个数组或集合转换成一个String或integer类型的一个对象。最终只拿到一个结果。

关键字:reduce reduce(a,(b,c)->{b+c});

  • a:规约初始值
  • b:阶段性的累加结果
  • c:当前遍历的元素

若是整数类型求和 (Integer),b和c 可换成方法引用 Integer::sum

先回顾一下map: stream().map 可以把数组中的元素从一种类型转换成另一种类型,也可以将多类型的集合变成单纯的只有一种类型的集合。

public class Reduce {
    public static void main(String[] args) {
        People p=new People("小明",19,"man");
        People p2=new People("小花",16,"man");
        People p3=new People("小刚",17,"man");
        People p4=new People("小龙",15,"man");
        People p5=new People("小新",20,"man");
        People p6=new People("小舞",18,"woman");
        List<People> list =new ArrayList<>();
        list.add(p);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        list.add(p5);
        list.add(p6);

        Integer res = list.stream().map(People::getAge).reduce(0,(a,b)->a+b);
        System.out.println(res);//105

        Integer reduce = list.stream().map(People::getAge).reduce(0, Integer::sum);
        System.out.println(reduce); //105

    }

}

规约并行:

我们都知道,stream()是可以并行的。就是可以充分利用cpu核数发挥cpu运行的最大效率。

并行关键字:parallelStream()

以上图所示,并行会对过程分组计算,之后得出两组,一个三,一个七,之后使用合并器,对两组结果进行累加计算得出最后结果。所谓合并器,就是对并行的每组结果进行累加。

Integer reduce2 = list.parallelStream().map(People::getAge).reduce(0, Integer::sum,Integer::sum);
System.out.println(reduce2); //105  

上面reduce第三个参数 Integer::sum 就是合并器

如果数据量较大时推荐使用parallelStream()并行运算,可以充分发挥cpu性能,提高运行效率。

Integer red = list.stream().reduce(0, (a, people) -> a + people.getAge(), Integer::sum);
System.out.println(red);//105

上面的reduce第三个参数就是合并器的第二个功能了: 当返回结果不一致时可以用合并器进行一个转型。

综上:

当对数组进行累加操作时推荐使用规约。尤其推荐并行规约。

合并器:

  • 对并行的累加结果进行最后统计
  • 对于每组结果类型不一致时进行累加后转型

猜你喜欢

转载自blog.csdn.net/admin123404/article/details/107599064
今日推荐