在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修改现存的值,而不是每处理一个元素,创建一个新值

packagelambda;

importjava.util.Arrays;

importjava.util.List;

importjava.util.Map;

importjava.util.stream.Collectors;

publicclassLambdaMapReduce {

privatestaticList users = Arrays.asList(

newUser(1,"张三",12,User.Sex.MALE),

newUser(2,"李四",21, User.Sex.FEMALE),

newUser(3,"王五",32, User.Sex.MALE),

newUser(4,"赵六",32, User.Sex.FEMALE));

publicstaticvoidmain(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适用于返回单个结果值的情况

//获取所有用户的平均年龄

privatestaticvoidreduceAvg() {

// mapToInt的pipeline后面可以是average,max,min,count,sum

doubleavg = users.parallelStream().mapToInt(User::getAge)

.average().getAsDouble();

System.out.println("reduceAvg User Age: "+ avg);

}

//获取所有用户的年龄总和

privatestaticvoidreduceSum() {

doublesum = users.parallelStream().mapToInt(User::getAge)

.reduce(0, (x, y) -> x + y);// 可以简写为.sum()

System.out.println("reduceSum User Age: "+ sum);

}

}

三、参考

本文链接:http://my.oschina.net/cloudcoder/blog/215169

【编辑推荐】

【责任编辑:chenqingxiang TEL:(010)68476606】

点赞 0

java steam collect_Java8 如何进行stream reduce,collection操作相关推荐

  1. java steam 去重_Java中对List去重 Stream去重的解决方法

    问题 当下互联网技术成熟,越来越多的趋向去中心化.分布式.流计算,使得很多以前在数据库侧做的事情放到了Java端.今天有人问道,如果数据库字段没有索引,那么应该如何根据该字段去重?大家都一致认为用Ja ...

  2. java 8 stream reduce详解和误区

    文章目录 简介 reduce详解 总结 java 8 stream reduce详解和误区 简介 Stream API提供了一些预定义的reduce操作,比如count(), max(), min() ...

  3. java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用

    java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用

  4. java8 stream reduce 方法用法 java stream reduce 方法使用方法

    java8 stream reduce 方法用法 java stream reduce 方法使用方法 一.背景 在使用Stream的reduce方法时,发现该方法有 3个重载方法,分别是: 一个参数. ...

  5. Java 字符串拼接4种实现方法(for循环、stream().reduce()、Collectors.joining()、String.join())

    1 for循环实现 List<String> list = new ArrayList<>(Arrays.asList("1", "2" ...

  6. Java Stream Reduce

    1 背景 1.1 编程思想 Map Reduce是一种编程思想 ,MapReduce 模型将数据处理方式抽象为 map 和 reduce map 也叫映射,它表现的是数据的一对一映射,通常完成数据转换 ...

  7. 跟我学 Java 8 新特性之 Stream 流(六)收集

    转载自   跟我学 Java 8 新特性之 Stream 流(六)收集 我们前面的五篇文章基本都是在说将一个集合转成一个流,然后对流进行操作,其实这种操作是最多的,但有时候我们也是需要从流中收集起一些 ...

  8. 跟我学 Java 8 新特性之 Stream 流(四)并行流

    转载自   跟我学 Java 8 新特性之 Stream 流(四)并行流 随着对流API认识的慢慢深入,本章我们要讨论的知识点是流API里面的并行流了. 在开始讨论并行流之前,我先引发一下大家的思考, ...

  9. 跟我学 Java 8 新特性之 Stream 流(五)映射

    转载自   跟我学 Java 8 新特性之 Stream 流(五)映射 经过了前面四篇文章的学习,相信大家对Stream流已经是相当的熟悉了,同时也掌握了一些高级功能了,如果你之前有阅读过集合框架的基 ...

最新文章

  1. 洛谷 - 试炼场(全部题目备份)
  2. postman api
  3. 与张小龙同行:微信小程序开发
  4. python的scrapy爬虫模块间进行传参_Python | Scrapy 爬虫过程问题解决(持续更新...)...
  5. “CEPH浅析”系列之七——关于CEPH的若干想法
  6. 前端学习(2674):vue3修改
  7. Leetcode--461. 汉明距离
  8. C#获取本执行程序所在的当前路径
  9. 底部导航栏使用BottomNavigationBar
  10. 编程的心法与注意事项
  11. python爬虫实战——爬取猫眼电影TOP100并导入excel表
  12. otsu算法详细推导、实现及Multi Level OTSU算法实现
  13. go语言中遍历中文出现乱码
  14. 鸿蒙电脑系统连不上打印机,电脑与打印机脱机怎么连接
  15. 格雷斯音频大篷车无线音箱回顾
  16. 常见大学机房的计算机设备,长江大学公共机房管理办法
  17. 朴素贝叶斯——凉鞋问题
  18. 故障转移集群搭建高可用文件共享服务器
  19. 《仙剑奇侠传3》仙术合集
  20. 华纳云:MySQL数据丢失的原因是什么及怎么解决

热门文章

  1. 第一次出差:有点迷糊,出现了很多问题,在此做一下备忘录
  2. Win7安全模式卡在ClassPNP.sys位置解决办法之一
  3. 鄙视糯米团购网, 声讨糯米团
  4. html 页面地图不显示图片,嵌入谷歌地图不显示在HTML页面
  5. 蓝桥杯单片机模块代码(DS1302时钟芯片)(代码+注释)
  6. No qualifying bean of type ‘com.alibaba.dubbo.config.ApplicationConfig‘ available: expected at least
  7. Hadoop学习(16)-MapReduce的shuffle详解
  8. 《最详细的docker+php开发环境教程》(五) 搭建开发环境概要
  9. 爬虫入门教程 —— 1
  10. 龙族幻想微信一区哪个服务器人多,龙族幻想微信一区-命运之刃开服时间表_龙族幻想新区开服预告_第一手游网手游开服表...