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. 疑难杂症 - SQL语句整理

    一.关联子查询-查日期最新列 前天在工作中遇到一条非常有用的SQL语句,想了好久愣是没搞出来.今天将这个问题模拟出来:先看表 需求是,对于每个人,仅显示时间最新的那一条记录. 答案如下: select ...

  2. Devexpress HtmlEditor 上传本地图片

    官方Demo地址:https://demos.devexpress.com/MVCxHTMLEditorDemos/Features/Features 控件的一定要包裹在form中 @using(Ht ...

  3. jQuery easyui combobox级联及内容联想

    1.需求:已有一个下拉框A表示地区,现新增需求,需要在A选择不同地区时,增加一个展示该地区所有城市的下拉框B, 由于城市较多,要求B能实现用户输入和模糊匹配展示功能. 2.实现: (1)首先在A下面把 ...

  4. MFC下调用控制台和控制台下MFC库的支持

    1.MFC下调用控制台 在CWinApp的InitInstance中对话框的DoModal之前加入 AllocConsole(); // 开辟控制台 SetConsoleTitle(_T(" ...

  5. using-ef-code-first-with-an-existing-database

    http://weblogs.asp.net/scottgu/using-ef-code-first-with-an-existing-database http://weblogs.asp.net/ ...

  6. mysql 学习碎片

    1.mysql 中执行 sql字符串 set @strSql='select 1200 as item'; prepare select_sql from @strSql; execute selec ...

  7. 使用UIKit制作卡牌游戏(二)ios游戏篇

    转自朋友Tommy 的翻译,自己只翻译了第三篇教程. 译者: Tommy | 原文作者: Matthijs Hollemans写于2012/07/06 原文地址: http://www.raywend ...

  8. S5PV210之Sate210-F DIY硬件,移植uboot,kernel,android 活动现在已经进入实施阶段吗,欢迎广大网友参与 !

    大家一起来diy 超低价四核的exynos4412或者Cortex A8S5pv210开源开发板 商业版Sate210已经完成了好久了.Sate4412 也已经出来.但是这两个接口非常全,主要是针对企 ...

  9. Ubuntu下PHP的扩展

    Ubuntu版本:14.04 1. 下载php-5.5.10.tar.bz2,并解压. 2.  终端进入解压后的目录php-5.5.10,运行configure.(输入命令./configure) 3 ...

  10. [转]Handy adb commands for Android

    转自:http://www.growingwiththeweb.com/2014/01/handy-adb-commands-for-android.html View connected devic ...