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. JS - Cookie: getCookie, setCookie

    JS function for Cookie 如果cookie未设置,判断时与空字符串‘’比较: function setCookie(cname, cvalue, exdays) { var d = ...

  2. 基于nodejs实现js后端化处理

    今天D哥给我提了个问题,"用php执行过js没"?咋一听,没戏~~毕竟常规情况下,js是依赖浏览器运行的.想在php后端采集的同时利用js运行结果并传递给php使用,没戏! 然后回 ...

  3. ubuntu14.04服务版/etc/init.d/smbd restart无效的解决方法

    刚装的ubuntu14.04配置完smbd发现service或者/etc/init.d/smbd restart都不显示任何输出,也没起作用 echo $?输出1,查看脚本发现 if init_is_ ...

  4. CI 框架去掉url 中index.php的方法

    1 修改 apache 的 httpd.conf 文件 #LoadModule rewrite_module modules/mod_rewrite.so 去掉前面的# 2 找到 你程序目录下的 .h ...

  5. thinkphp 3.2.3+Admin LTE后台框架

  6. Android SDK开发包国内下载地址

    不知道是因为最近kaihui还是怎么的,打开android sdk官方网站特别的慢,想下载最新版本的platform几乎变成不可能完成的任务,不知道为什么Google不像Apache那样在各国设立镜像 ...

  7. 几种在Linux下查询外网IP的办法

    原文地址:http://my.oschina.net/epstar/blog/513186 Curl 纯文本格式输出: curl icanhazip.com curl ifconfig.me curl ...

  8. Java 停止一个 Thread

    boolean   flag=true;         public   void   run(){             while(flag){                     ... ...

  9. 谷歌正式发布Google APIs Client Library for .NET

    好消息,特大好消息! 英文原文:Google API library for .NET paves the way for Google services on Windows phone 本月 17 ...

  10. 比较几种工具Python(x,y) Anaconda WinPython

    浏览了一些相关的论坛,将几大工具的特点分别总结下: Python(x,y) 更新很慢,稳定性一般,默认带有很多包. WinPython  只能在windows上跑,界面友好,和Python(x,y)是 ...