规约:大致可以理解为将一个数组或集合转换成一个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第三个参数就是合并器的第二个功能了: 当返回结果不一致时可以用合并器进行一个转型。
综上:
当对数组进行累加操作时推荐使用规约。尤其推荐并行规约。
合并器:
对并行的累加结果进行最后统计
对于每组结果类型不一致时进行累加后转型