博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java8 stream的reduce,collection操作
阅读量:6948 次
发布时间:2019-06-27

本文共 3121 字,大约阅读时间需要 10 分钟。

hot3.png

一、概念介绍

在java8 JDK包含许多聚合操作(如平均值,总和,最小,最大,和计数),返回一个计算流stream的聚合结果。这些聚合操作被称为聚合操作。JDK除返回单个值的聚合操作外,还有很多聚合操作返回一个collection集合实例。很多的reduce操作执行特定的任务,如求平均值或按类别分组元素。

JDK提供的通用的聚合操作:Stream.reduce,Stream.collection

注意:本文将reduction operations翻译为聚合操作,因为reduction operations通常用于汇聚统计。

两者的区别:

Stream.reduce,常用的方法有average, sum, min, max, and count,返回单个的结果值,并且reduce操作每处理一个元素总是创建一个新值

Stream.collection与stream.reduce方法不同,Stream.collect修改现存的值,而不是每处理一个元素,创建一个新值

二、源代码

package lambda; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class LambdaMapReduce {     private static List
 users = Arrays.asList(             new User(1, "张三", 12,User.Sex.MALE),              new User(2, "李四", 21, User.Sex.FEMALE),              new User(3,"王五", 32, User.Sex.MALE),              new User(4, "赵六", 32, User.Sex.FEMALE));     public static void main(String[] args) {         reduceAvg();         reduceSum();                  //与stream.reduce方法不同,Stream.collect修改现存的值,而不是每处理一个元素,创建一个新值         //获取所有男性用户的平均年龄         Averager averageCollect = users.parallelStream()                 .filter(p -> p.getGender() == User.Sex.MALE)                 .map(User::getAge)                 .collect(Averager::new, Averager::accept, Averager::combine);         System.out.println("Average age of male members: "                 + averageCollect.average());         //获取年龄大于12的用户列表         List
 list = users.parallelStream().filter(p -> p.age > 12)                 .collect(Collectors.toList());         System.out.println(list);         //按性别统计用户数         Map
 map = users.parallelStream().collect(                 Collectors.groupingBy(User::getGender,                         Collectors.summingInt(p -> 1)));         System.out.println(map);         //按性别获取用户名称         Map
> map2 = users.stream()                 .collect(                         Collectors.groupingBy(                                 User::getGender,                                 Collectors.mapping(User::getName,                                         Collectors.toList())));         System.out.println(map2);                  //按性别求年龄的总和         Map
 map3 = users.stream().collect(                 Collectors.groupingBy(User::getGender,                         Collectors.reducing(0, User::getAge, Integer::sum)));         System.out.println(map3);                  //按性别求年龄的平均值         Map
 map4 = users.stream().collect(                 Collectors.groupingBy(User::getGender,                         Collectors.averagingInt(User::getAge)));         System.out.println(map4);     }     // 注意,reduce操作每处理一个元素总是创建一个新值,     // Stream.reduce适用于返回单个结果值的情况     //获取所有用户的平均年龄     private static void reduceAvg() {         // mapToInt的pipeline后面可以是average,max,min,count,sum         double avg = users.parallelStream().mapToInt(User::getAge)                  .average().getAsDouble();         System.out.println("reduceAvg User Age: " + avg);     }     //获取所有用户的年龄总和     private static void reduceSum() {         double sum = users.parallelStream().mapToInt(User::getAge)                 .reduce(0, (x, y) -> x + y); // 可以简写为.sum()         System.out.println("reduceSum User Age: " + sum);     } } 

另一篇文章比较好的讲解了reduce操作原理:

转载于:https://my.oschina.net/u/2391658/blog/872694

你可能感兴趣的文章
用GoAccess分析Nginx的日志
查看>>
我的友情链接
查看>>
iOS客户端调微信支付只出现确定按钮的问题
查看>>
Windows下安装MongoDB
查看>>
virtualbox不能安装64位系统的解决方法
查看>>
选型 - QA testing tools 2/26/2016
查看>>
Linux培训大纲
查看>>
sqlalchemy(一)基本操作
查看>>
Python: pip常见的使用方法
查看>>
CSS 专业技巧收集
查看>>
mybatis 查询时 拼接order by语句
查看>>
linux基础命令
查看>>
JuniperSRX Dynamic *** (Remote Access ***)
查看>>
Apache服务器概述及练习
查看>>
Windows 2003 AD升级至Windows 2012 AD之DHCP服务器迁移
查看>>
精心挑选的12款优秀 jQuery Ajax 分页插件和教程
查看>>
在有网络安全策略的环境加域所需要启开的端口
查看>>
nginx 策略生效的先后顺序
查看>>
HRESULT:0x80029C4A错误
查看>>
需求分析师的五项修炼(转载)
查看>>