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. android中无限循环滑动的gallery实例

    android中无限循环滑动的gallery实例 1.点击图片有变暗的效果,使用imageview.setAlpha(),并且添加ontouchListener public void init() ...

  2. db2安装及卸载

    创建用户和组: #创建组信息 groupadd -g db2iadm1 groupadd -g db2fadm1 groupadd -g dasadm1 #创建用户信息 useradd -u -g d ...

  3. mem_fun 例子

    // functional_mem_fun.cpp // compile with: /EHsc #include <vector> #include <functional> ...

  4. sql server 2008安装过程中服务器配置出错

    请选择:对所有 SQL Server 服务使用相同的账号: 但这里不能给他设置自己定义的账号和密码 ( 例如下面设置它的账号为 sa ,密码为 654321) 就会发生错误:

  5. 超时时间已到。在操作完成之前超时时间已过或服务器未响应。 (.Net SqlClient Data Provider)

    超时时间已到.在操作完成之前超时时间已过或服务器未响应. (.Net SqlClient Data Provider) 在做一个小东西的时候出现了这个问题,就是使用VS调试几次项目后,使用SQL Se ...

  6. IOS UITableView下拉刷新和上拉加载功能的实现

    在IOS开发中UITableView是非常常用的一个功能,而在使用UITableView的时候我们经常要用到下拉刷新和上拉加载的功能,今天花时间实现了简单的UITableView的下拉刷新和上拉加载功 ...

  7. STM32 flash 内存分布介绍

    摘要: 本文以STM32F103RBT6为例介绍了片上Flash(Embedded Flash)若干问题,包括Flash大小(内存映射).块大小.页面大小.寄存器.这些知识,有利于写Flash驱动. ...

  8. Netty5 + Protobuf 使用

    1. 安装开发环境 1.1 Netty环境 这里我使用Netty5.0.0版本 到这里下载即可http://netty.io/ 下载netty-all-5.0.0.Alpha2.jar 这个jar包简 ...

  9. `cocos2dx非完整` 日志模块 增量更新

    在上一篇文章中,说到了"流程"的由来,以及我对流程的使用. 这一片就是对流程的应用.前一篇文章中说到了三条流程 check_log_measure, check_env_measu ...

  10. android程序---->android多线程下载(一)

    多线程下载是加快下载速度的一种方式,通过开启多个线程去执行一个任务,可以使任务的执行速度变快.多线程的任务下载时常都会使用得到断点续传下载,就是我们在一次下载未结束时退出下载,第二次下载时会接着第一次 ...