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数据库对于保存特殊字符的解决办法

    数据库的Char.Vachar类型可以兼容汉字,但特殊字符不行,在保存包含有特殊字符的字符串.正文时,会将特殊符号替换成一个”?”号. 例如: “基础教育课程手机报•特刊” == > “基础教育 ...

  2. ubuntu下解决wireshark权限问题

    wireshark要监控eth0,但是必须要root权限才行.但是,直接用root运行程序是相当危险,也是非常不方便的. 解决方法如下: 1.添加wireshark用户组 sudo groupadd ...

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

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

  4. [转] VB之Val()函数的使用

    在VB中,也许你或多或少会希望得到的数据转换成数字类型,数字类型既可以是整形,单精度,双精度,浮点数,只要是数字类型这个都可以使用,不过此函数只返回字符串中包含的数字,若第一个字符为字母或者非数字字符 ...

  5. Java框架篇---Mybatis 入门

    一.Mybatis介绍 MyBatis是一款一流的支持自定义SQL.存储过程和高级映射的持久化框架.MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去设置参数和获取检索结果.MyBatis ...

  6. 微信公众号开发第二课 百度BAE搭建和数据库使用

    上一节主要是一些准备知识,本课还是准备知识,开发微信也可以不使用数据库,但是要想搭建一些查询类应用,就可能使用到数据库操作,所以本节主要涉及到百度BAE上面的数据库表的创建,插入数据,修改数据,删除数 ...

  7. WPF小记——DockPanel使用不当引起界面显示问题

    使用以下代码,当TextBlock文本过长,引起Button的显示位置在可见区域以外: <Window x:Class="WpfApplication11.MainWindow&quo ...

  8. 斜堆(三)之 Java的实现

    概要 前面分别通过C和C++实现了斜堆,本章给出斜堆的Java版本.还是那句老话,三种实现的原理一样,择其一了解即可. 目录1. 斜堆的介绍2. 斜堆的基本操作3. 斜堆的Java实现(完整源码)4. ...

  9. [IR] Tolerant Retrieval & Spelling Correction & Language Model

    Dictionary不一定是个list,它可以是多种形式. 放弃Hash的原因: 通常,tree是比较适合的结构. From: http://www.cnblogs.com/v-July-v/arch ...

  10. Nightwatch.js – 轻松实现浏览器的自动测试

    Nightwatch.js 是一个易于使用的,基于 Node.js 平台的浏览器自动化测试解决方案.它使用强大的 Selenium WebDriver API 来在 DOM 元素上执行命令和断言. 语 ...