java理论基础Stream reduce实现集合元素归约

 更新时间:2022年03月16日 14:52:17   作者:字母哥哥  
这篇文章主要为大家介绍了java理论基础Stream reduce实现集合元素归约示例详解有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步

Stream API为我们提供了Stream.reduce用来实现集合元素的归约。reduce函数有三个参数:

Identity标识:一个元素,它是归约操作的初始值,如果流为空,则为默认结果。

Accumulator累加器:具有两个参数的函数:归约运算的部分结果和流的下一个元素。

Combiner合并器(可选):当归约并行化时,或当累加器参数的类型与累加器实现的类型不匹配时,用于合并归约操作的部分结果的函数。

注意观察上面的图,我们先来理解累加器:

阶段累加结果作为累加器的第一个参数

集合遍历元素作为累加器的第二个参数

Integer类型归约

reduce初始值为0,累加器可以是lambda表达式,也可以是方法引用。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
int result = numbers
        .stream()
        .reduce(0, (subtotal, element) -> subtotal + element);
System.out.println(result);  //21

int result = numbers
        .stream()
        .reduce(0, Integer::sum);
System.out.println(result); //21

String类型归约

不仅可以归约Integer类型,只要累加器参数类型能够匹配,可以对任何类型的集合进行归约计算。

List<String> letters = Arrays.asList("a", "b", "c", "d", "e");
String result = letters
        .stream()
        .reduce("", (partialString, element) -> partialString + element);
System.out.println(result);  //abcde
String result = letters
        .stream()
        .reduce("", String::concat);
System.out.println(result);  //ancde

复杂对象归约

计算所有的员工的年龄总和。

Employee e1 = new Employee(1,23,"M","Rick","Beethovan");
Employee e2 = new Employee(2,13,"F","Martina","Hengis");
Employee e3 = new Employee(3,43,"M","Ricky","Martin");
Employee e4 = new Employee(4,26,"M","Jon","Lowman");
Employee e5 = new Employee(5,19,"F","Cristine","Maria");
Employee e6 = new Employee(6,15,"M","David","Feezor");
Employee e7 = new Employee(7,68,"F","Melissa","Roy");
Employee e8 = new Employee(8,79,"M","Alex","Gussin");
Employee e9 = new Employee(9,15,"F","Neetu","Singh");
Employee e10 = new Employee(10,45,"M","Naveen","Jain");
List<Employee> employees = Arrays.asList(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10);
Integer total = employees.stream().map(Employee::getAge).reduce(0,Integer::sum);
System.out.println(total); //346

先用map将Stream流中的元素由Employee类型处理为Integer类型(age)。

然后对Stream流中的Integer类型进行归约

Combiner合并器的使用

除了使用map函数实现类型转换后的集合归约,我们还可以用Combiner合并器来实现,这里第一次使用到了Combiner合并器。 因为Stream流中的元素是Employee,累加器的返回值是Integer,所以二者的类型不匹配。这种情况下可以使用Combiner合并器对累加器的结果进行二次归约,相当于做了类型转换。

Integer total3 = employees.stream()
        .reduce(0,(totalAge,emp) -> totalAge + emp.getAge(),Integer::sum); //注意这里reduce方法有三个参数
System.out.println(total); //346

计算结果和使用map进行数据类型转换的方式是一样的。

并行流数据归约(使用合并器)

对于大数据量的集合元素归约计算,更能体现出Stream并行流计算的威力。

在进行并行流计算的时候,可能会将集合元素分成多个组计算。为了更快的将分组计算结果累加,可以使用合并器。

Integer total2 = employees
        .parallelStream()
        .map(Employee::getAge)
        .reduce(0,Integer::sum,Integer::sum);  //注意这里reduce方法有三个参数
System.out.println(total); //346

以上就是java理论基础Stream reduce实现集合元素归约的详细内容,更多关于java Stream reduce集合元素归约的资料请关注脚本之家其它相关文章!

相关文章

  • 为什么阿里要慎重使用ArrayList中的subList方法

    为什么阿里要慎重使用ArrayList中的subList方法

    这篇文章主要介绍了为什么要慎重使用ArrayList中的subList方法,subList是List接口中定义的一个方法,该方法主要用于返回一个集合中的一段、可以理解为截取一个集合中的部分元素,他的返回值也是一个List。,需要的朋友可以参考下
    2019-06-06
  • Java设计模式之java解释器模式详解

    Java设计模式之java解释器模式详解

    这篇文章主要介绍了Java设计模式之解释器模式定义与用法,结合具体实例形式详细分析了Java解释器模式的概念、原理、定义及相关操作技巧,需要的朋友可以参考下
    2021-09-09
  • Java调用新浪api通过Ip查询地区

    Java调用新浪api通过Ip查询地区

    这篇文章主要介绍了Java调用新浪接口通过Ip查询地区,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java Map.entry案例详解

    Java Map.entry案例详解

    这篇文章主要介绍了Java Map.entry案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Spring Initializr只能创建为Java 17版本以上的问题解决

    Spring Initializr只能创建为Java 17版本以上的问题解决

    这篇文章主要给大家介绍了关于Spring Initializr只能创建为Java 17版本以上问题的解决办法,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • java实现饮料自助售货机

    java实现饮料自助售货机

    这篇文章主要为大家详细介绍了java实现饮料自助售货机,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • java中MultipartFile类型转为File类型的4种方法

    java中MultipartFile类型转为File类型的4种方法

    Spring提供了一个MultipartFile接口来处理文件上传,但有时候我们需要将MultipartFile转换为File来进行一些特定的操作,比如保存文件到本地或者进行文件的处理等,这篇文章主要给大家介绍了关于java中MultipartFile类型转为File类型的4种方法,需要的朋友可以参考下
    2024-09-09
  • springboot整合消息队列RabbitMQ

    springboot整合消息队列RabbitMQ

    这篇文章主要介绍了springboot整合消息队列RabbitMQ,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • MySQL中关键字UNION和UNION ALL的区别

    MySQL中关键字UNION和UNION ALL的区别

    本文主要介绍了MySQL中关键字UNION和UNION ALL的区别,深入探讨UNION和UNION ALL的定义、用法、主要区别,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • spring-cloud入门之eureka-client(服务注册)

    spring-cloud入门之eureka-client(服务注册)

    本篇文章主要介绍了spring-cloud入门之eureka-client(服务注册),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01

最新评论