Lambda元素规约

简介: Lambda元素规约

image.png

规约:大致可以理解为将一个数组或集合转换成一个String或integer类型的一个对象。最终只拿到一个结果。
关键字:reduce reduce(a,(b,c)->{b+c});
a:规约初始值
b:阶段性的累加结果
c:当前遍历的元素
若是整数类型求和 (Integer),b和c 可换成方法引用 Integer::sum

image.png

先回顾一下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()

image.png

以上图所示,并行会对过程分组计算,之后得出两组,一个三,一个七,之后使用合并器,对两组结果进行累加计算得出最后结果。所谓合并器,就是对并行的每组结果进行累加。
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第三个参数就是合并器的第二个功能了: 当返回结果不一致时可以用合并器进行一个转型。

综上:
当对数组进行累加操作时推荐使用规约。尤其推荐并行规约。
合并器:
对并行的累加结果进行最后统计
对于每组结果类型不一致时进行累加后转型

目录
相关文章
|
7月前
|
JavaScript 前端开发 Java
23、匿名类的排序、Lambda 表达式、方法引用
23、匿名类的排序、Lambda 表达式、方法引用
42 0
|
Java 编译器 API
4.3 Lambda表达式的性能与限制:在某些情况下避免使用Lambda表达
4.3 Lambda表达式的性能与限制:在某些情况下避免使用Lambda表达
1366 0
|
Java 开发者
lambda让代码更优雅
Lambda表达式是Java 8中引入的一个重要特性,它允许开发者以更简洁的方式编写匿名函数,使得代码更加紧凑和易读。Lambda表达式是函数式编程的一种体现,可以将函数作为方法的参数传递,并且可以使用更简洁的语法实现函数式接口(只有一个抽象方法的接口)的实例化。Lambda表达式的语法形式为 (参数列表) -> {表达式或语句块}。
82 0
|
编译器 C++
C++中Lambda函数的含义及其本质
C++中Lambda函数的含义及其本质
413 0
C++中Lambda函数的含义及其本质
|
存储 算法 编译器
【C++】lambda 表达式 | 包装器
【C++】lambda 表达式 | 包装器
【C++】lambda 表达式 | 包装器
|
JavaScript 前端开发 Java
第23篇:匿名类的排序、Lambda 表达式、方法引用
🔖 Lambda Expression 是 Java8 开始才有的语法 🔖 函数式接口(Functional Interface):只包含1个抽象方法的接口(可以包含多个默认方法和静态方法) 📕 可以在接口上加上@FunctionalInterface注解,表示它是一个函数式接口 🔖 当匿名类实现的是函数式接口的时候,可以使用 Lambda 表达式简化代码的书写(但是匿名类和 Lambda 在作用域上还是有点区别的)
235 0
Lambda 实战-两个不同的集合合并成一个新的集合
Lambda 实战-两个不同的集合合并成一个新的集合
|
Java 编译器
Java 8 新特性:Lambda 表达式之方法引用(Lambda 表达式补充版)
Java 8 新特性:Lambda 表达式之方法引用(Lambda 表达式补充版)
230 0
Java 8 新特性:Lambda 表达式之方法引用(Lambda 表达式补充版)
|
Java
【Groovy】集合遍历 ( 调用集合的 every 方法判定集合中的所有元素是否符合闭包规则 | =~ 运算符等价于 contains 函数 | 代码示例 )
【Groovy】集合遍历 ( 调用集合的 every 方法判定集合中的所有元素是否符合闭包规则 | =~ 运算符等价于 contains 函数 | 代码示例 )
193 0
【Groovy】集合遍历 ( 调用集合的 every 方法判定集合中的所有元素是否符合闭包规则 | =~ 运算符等价于 contains 函数 | 代码示例 )
|
存储 自然语言处理 安全
Java 8 新特性:Lambda 表达式的作用域(Lambda 表达式补充版)
Java 8 新特性:Lambda 表达式的作用域(Lambda 表达式补充版)
668 0