Java8 如何进行stream reduce,collection操作

2014-07-16 16:42 佚名 oschina 字号:T | T

在java8 JDK包含许多聚合操作(如平均值,总和,最小,最大,和计数),返回一个计算流stream的聚合结果。这些聚合操作被称为聚合操作

AD:51CTO 网+ 第十二期沙龙:大话数据之美_如何用数据驱动用户体验

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

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

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

两者的区别:

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

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

  1. package lambda;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. import java.util.Map;
  5. import java.util.stream.Collectors;
  6. public class LambdaMapReduce {
  7. private static List<User> users = Arrays.asList(
  8. new User(1, "张三", 12,User.Sex.MALE),
  9. new User(2, "李四", 21, User.Sex.FEMALE),
  10. new User(3,"王五", 32, User.Sex.MALE),
  11. new User(4, "赵六", 32, User.Sex.FEMALE));
  12. public static void main(String[] args) {
  13. reduceAvg();
  14. reduceSum();
  15. //与stream.reduce方法不同,Stream.collect修改现存的值,而不是每处理一个元素,创建一个新值
  16. //获取所有男性用户的平均年龄
  17. Averager averageCollect = users.parallelStream()
  18. .filter(p -> p.getGender() == User.Sex.MALE)
  19. .map(User::getAge)
  20. .collect(Averager::new, Averager::accept, Averager::combine);
  21. System.out.println("Average age of male members: "
  22. + averageCollect.average());
  23. //获取年龄大于12的用户列表
  24. List<User> list = users.parallelStream().filter(p -> p.age > 12)
  25. .collect(Collectors.toList());
  26. System.out.println(list);
  27. //按性别统计用户数
  28. Map<User.Sex, Integer> map = users.parallelStream().collect(
  29. Collectors.groupingBy(User::getGender,
  30. Collectors.summingInt(p -> 1)));
  31. System.out.println(map);
  32. //按性别获取用户名称
  33. Map<User.Sex, List<String>> map2 = users.stream()
  34. .collect(
  35. Collectors.groupingBy(
  36. User::getGender,
  37. Collectors.mapping(User::getName,
  38. Collectors.toList())));
  39. System.out.println(map2);
  40. //按性别求年龄的总和
  41. Map<User.Sex, Integer> map3 = users.stream().collect(
  42. Collectors.groupingBy(User::getGender,
  43. Collectors.reducing(0, User::getAge, Integer::sum)));
  44. System.out.println(map3);
  45. //按性别求年龄的平均值
  46. Map<User.Sex, Double> map4 = users.stream().collect(
  47. Collectors.groupingBy(User::getGender,
  48. Collectors.averagingInt(User::getAge)));
  49. System.out.println(map4);
  50. }
  51. // 注意,reduce操作每处理一个元素总是创建一个新值,
  52. // Stream.reduce适用于返回单个结果值的情况
  53. //获取所有用户的平均年龄
  54. private static void reduceAvg() {
  55. // mapToInt的pipeline后面可以是average,max,min,count,sum
  56. double avg = users.parallelStream().mapToInt(User::getAge)
  57. .average().getAsDouble();
  58. System.out.println("reduceAvg User Age: " + avg);
  59. }
  60. //获取所有用户的年龄总和
  61. private static void reduceSum() {
  62. double sum = users.parallelStream().mapToInt(User::getAge)
  63. .reduce(0, (x, y) -> x + y); // 可以简写为.sum()
  64. System.out.println("reduceSum User Age: " + sum);
  65. }
  66. }
   

三、参考

http://docs.oracle.com/javase/tutorial/collections/streams/reduction.html

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

Java8 如何进行stream reduce,collection操作的更多相关文章

  1. Java8中的Stream流式操作 - 入门篇

    作者:汤圆 个人博客:javalover.cc 前言 之前总是朋友朋友的叫,感觉有套近乎的嫌疑,所以后面还是给大家改个称呼吧 因为大家是来看东西的,所以暂且叫做官人吧(灵感来自于民间流传的四大名著之一 ...

  2. Java8 新特性 Stream 非短路终端操作

    非短路终端操作 Java8 新特性 Stream 练习实例 非短路终端操作,就是所有的元素都遍厉完,直到最后才结束.用来收集成自己想要的数据. 方法有: 遍厉 forEach 归约 reduce 最大 ...

  3. 【Java8新特性】面试官:谈谈Java8中的Stream API有哪些终止操作?

    写在前面 如果你出去面试,面试官问了你关于Java8 Stream API的一些问题,比如:Java8中创建Stream流有哪几种方式?(可以参见:<[Java8新特性]面试官问我:Java8中 ...

  4. [三]java8 函数式编程Stream 概念深入理解 Stream 运行原理 Stream设计思路

    Stream的概念定义   官方文档是永远的圣经~     表格内容来自https://docs.oracle.com/javase/8/docs/api/   Package java.util.s ...

  5. <JAVA8新增内容>关于集合的操作(Collection/Iterator/Stream)

    因为下文频繁使用lambda表达式,关于Java中的lambda表达式内容请见: http://www.cnblogs.com/guguli/p/4394676.html 一.使用增强的Iterato ...

  6. Java8——Stream流式操作的一点小总结

    我发现,自从我学了Stream流式操作之后,工作中使用到的频率还是挺高的,因为stream配合着lambda表达式或者双冒号(::)使用真的是优雅到了极致!今天就简单分(搬)享(运)一下我对strea ...

  7. Java8 Stream 的一些操作和介绍

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11858186.html Java8 Stream 是一个新的东西, 就是能够将常见的数据结构转 ...

  8. Java8 新特性 Stream 短路终端操作

    短路终端操作 Java8 新特性 Stream 练习实例 传入一个谓词,返回传为boolean,如果符合条件,则直接结束流. 匹配所有 allMatch 任意匹配 anymMatch 不匹配 none ...

  9. Java8 新特性 Stream 无状态中间操作

    无状态中间操作 Java8 新特性 Stream 练习实例 中间无状态操作,可以在单个对单个的数据进行处理.比如:filter(过滤)一个元素的时候,也可以判断,比如map(映射)... 过滤 fil ...

随机推荐

  1. ExtJS远程数据-本地分页

    背景 一般情况下,分页展示是前端只负责展示,后台通过SQL语句实现分页查询.当总数据量在千条以下,适合一次性查询出符合条件的所有数据,让前端页面负责分页也是一种选择. 实例 现通过ExtJS 4扩展类 ...

  2. 关于bootstrapValidator提交问题的解决

    关于bootstrapValidator的AJAX提交有几种方法: 1.form中一定要放一个类型为submit的按钮,然后添加 success.form.bv 事件,如下 on('success.f ...

  3. 为什么这样写js:(function ($) { })(jQuery);

    很多时候,会这样写js,比如公司的项目里面的js页面都这样,所以我就想搞清楚意思: <script language="javascript" type="text ...

  4. 使用Doxygen生成net帮助文档

    一. 什么是Doxygen? Doxygen 是一个程序的文件产生工具,可将程序中的特定批注转换成为说明文件.通常我们在写程序时,或多或少都会写上批注,但是对于其它人而言,要直接探索程序里的批注,与打 ...

  5. C#创建windows服务并定时执行

    一.创建window服务 1.新建项目-->选择Windows服务.默认生成文件包括Program.cs,Service1.cs 2.在Service1.cs添加如下代码: System.Tim ...

  6. C#多线程管理代码

    /// <summary> /// 多线程执行 /// </summary> public class MultiThreadingWorker { /// <summa ...

  7. Web Fram 2 for IIS7.X(Microsoft Web Farm Framework)

    Microsoft Web Farm Framework (WFF) 2.0 是微软开发的.基于IIS 7.x的小插件,能够帮助我们轻松实现Web网站的高性能.高可用性,用来在Web服务器群上提供和管 ...

  8. gulp-uglify《JS压缩》----gulp系列(四)

    本节实现JS压缩,在实现压缩前,先配置JS任务,设置源目录和输出目录. 在系列(三)代码的基础上,再进行扩展. 1.找到gulp->config.js,对JS进行源目录(src->img) ...

  9. Parallax.js – 自适应智能设备方向的视差效果插件

    Parallax.js 是一个简单的,轻量级的的视差引擎,能够对智能设备的方向作出反应.在没有没有陀螺仪或运动检测硬件可用的时候,使用光标的位置来代替.有很多的行为,你就可以设置为任何给定的视差实例. ...

  10. Linux用户组管理

    用户组信息存放:/etc/group 当组内只有一个用户,并且用户名和用户组名一致时默认不显示:组号1-499是系统预留的用户组,>=500的用户组是管理员手动创建的,组密码占位符用x表示   ...