Java8 如何进行stream reduce,collection操作
Java8 如何进行stream reduce,collection操作
在java8 JDK包含许多聚合操作(如平均值,总和,最小,最大,和计数),返回一个计算流stream的聚合结果。这些聚合操作被称为聚合操作
在java8 JDK包含许多聚合操作(如平均值,总和,最小,最大,和计数),返回一个计算流stream的聚合结果。这些聚合操作被称为聚合操作。 JDK除返回单个值的聚合操作外,还有很多聚合操作返回一个collection集合实例。很多的reduce操作执行特定的任务,如求平均值或按类别分 组元素。
JDK提供的通用的聚合操作:Stream.reduce,Stream.collection
注意:本文将reduction operations翻译为聚合操作,因为reduction operations通常用于汇聚统计。
两者的区别:
Stream.reduce,常用的方法有average, sum, min, max, and count,返回单个的结果值,并且reduce操作每处理一个元素总是创建一个新值
Stream.collection与stream.reduce方法不同,Stream.collect修改现存的值,而不是每处理一个元素,创建一个新值
- package lambda;
- import java.util.Arrays;
- import java.util.List;
- import java.util.Map;
- import java.util.stream.Collectors;
- public class LambdaMapReduce {
- private static List<User> users = Arrays.asList(
- new User(1, "张三", 12,User.Sex.MALE),
- new User(2, "李四", 21, User.Sex.FEMALE),
- new User(3,"王五", 32, User.Sex.MALE),
- new User(4, "赵六", 32, User.Sex.FEMALE));
- public static void main(String[] args) {
- reduceAvg();
- reduceSum();
- //与stream.reduce方法不同,Stream.collect修改现存的值,而不是每处理一个元素,创建一个新值
- //获取所有男性用户的平均年龄
- Averager averageCollect = users.parallelStream()
- .filter(p -> p.getGender() == User.Sex.MALE)
- .map(User::getAge)
- .collect(Averager::new, Averager::accept, Averager::combine);
- System.out.println("Average age of male members: "
- + averageCollect.average());
- //获取年龄大于12的用户列表
- List<User> list = users.parallelStream().filter(p -> p.age > 12)
- .collect(Collectors.toList());
- System.out.println(list);
- //按性别统计用户数
- Map<User.Sex, Integer> map = users.parallelStream().collect(
- Collectors.groupingBy(User::getGender,
- Collectors.summingInt(p -> 1)));
- System.out.println(map);
- //按性别获取用户名称
- Map<User.Sex, List<String>> map2 = users.stream()
- .collect(
- Collectors.groupingBy(
- User::getGender,
- Collectors.mapping(User::getName,
- Collectors.toList())));
- System.out.println(map2);
- //按性别求年龄的总和
- Map<User.Sex, Integer> map3 = users.stream().collect(
- Collectors.groupingBy(User::getGender,
- Collectors.reducing(0, User::getAge, Integer::sum)));
- System.out.println(map3);
- //按性别求年龄的平均值
- Map<User.Sex, Double> map4 = users.stream().collect(
- Collectors.groupingBy(User::getGender,
- Collectors.averagingInt(User::getAge)));
- System.out.println(map4);
- }
- // 注意,reduce操作每处理一个元素总是创建一个新值,
- // Stream.reduce适用于返回单个结果值的情况
- //获取所有用户的平均年龄
- private static void reduceAvg() {
- // mapToInt的pipeline后面可以是average,max,min,count,sum
- double avg = users.parallelStream().mapToInt(User::getAge)
- .average().getAsDouble();
- System.out.println("reduceAvg User Age: " + avg);
- }
- //获取所有用户的年龄总和
- private static void reduceSum() {
- double sum = users.parallelStream().mapToInt(User::getAge)
- .reduce(0, (x, y) -> x + y); // 可以简写为.sum()
- System.out.println("reduceSum User Age: " + sum);
- }
- }
三、参考
http://docs.oracle.com/javase/tutorial/collections/streams/reduction.html
本文链接:http://my.oschina.net/cloudcoder/blog/215169
Java8 如何进行stream reduce,collection操作的更多相关文章
- Java8中的Stream流式操作 - 入门篇
作者:汤圆 个人博客:javalover.cc 前言 之前总是朋友朋友的叫,感觉有套近乎的嫌疑,所以后面还是给大家改个称呼吧 因为大家是来看东西的,所以暂且叫做官人吧(灵感来自于民间流传的四大名著之一 ...
- Java8 新特性 Stream 非短路终端操作
非短路终端操作 Java8 新特性 Stream 练习实例 非短路终端操作,就是所有的元素都遍厉完,直到最后才结束.用来收集成自己想要的数据. 方法有: 遍厉 forEach 归约 reduce 最大 ...
- 【Java8新特性】面试官:谈谈Java8中的Stream API有哪些终止操作?
写在前面 如果你出去面试,面试官问了你关于Java8 Stream API的一些问题,比如:Java8中创建Stream流有哪几种方式?(可以参见:<[Java8新特性]面试官问我:Java8中 ...
- [三]java8 函数式编程Stream 概念深入理解 Stream 运行原理 Stream设计思路
Stream的概念定义 官方文档是永远的圣经~ 表格内容来自https://docs.oracle.com/javase/8/docs/api/ Package java.util.s ...
- <JAVA8新增内容>关于集合的操作(Collection/Iterator/Stream)
因为下文频繁使用lambda表达式,关于Java中的lambda表达式内容请见: http://www.cnblogs.com/guguli/p/4394676.html 一.使用增强的Iterato ...
- Java8——Stream流式操作的一点小总结
我发现,自从我学了Stream流式操作之后,工作中使用到的频率还是挺高的,因为stream配合着lambda表达式或者双冒号(::)使用真的是优雅到了极致!今天就简单分(搬)享(运)一下我对strea ...
- Java8 Stream 的一些操作和介绍
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11858186.html Java8 Stream 是一个新的东西, 就是能够将常见的数据结构转 ...
- Java8 新特性 Stream 短路终端操作
短路终端操作 Java8 新特性 Stream 练习实例 传入一个谓词,返回传为boolean,如果符合条件,则直接结束流. 匹配所有 allMatch 任意匹配 anymMatch 不匹配 none ...
- Java8 新特性 Stream 无状态中间操作
无状态中间操作 Java8 新特性 Stream 练习实例 中间无状态操作,可以在单个对单个的数据进行处理.比如:filter(过滤)一个元素的时候,也可以判断,比如map(映射)... 过滤 fil ...
随机推荐
- SQL数据库对于保存特殊字符的解决办法
数据库的Char.Vachar类型可以兼容汉字,但特殊字符不行,在保存包含有特殊字符的字符串.正文时,会将特殊符号替换成一个”?”号. 例如: “基础教育课程手机报•特刊” == > “基础教育 ...
- ubuntu下解决wireshark权限问题
wireshark要监控eth0,但是必须要root权限才行.但是,直接用root运行程序是相当危险,也是非常不方便的. 解决方法如下: 1.添加wireshark用户组 sudo groupadd ...
- 超时时间已到。在操作完成之前超时时间已过或服务器未响应。 (.Net SqlClient Data Provider)
超时时间已到.在操作完成之前超时时间已过或服务器未响应. (.Net SqlClient Data Provider) 在做一个小东西的时候出现了这个问题,就是使用VS调试几次项目后,使用SQL Se ...
- [转] VB之Val()函数的使用
在VB中,也许你或多或少会希望得到的数据转换成数字类型,数字类型既可以是整形,单精度,双精度,浮点数,只要是数字类型这个都可以使用,不过此函数只返回字符串中包含的数字,若第一个字符为字母或者非数字字符 ...
- Java框架篇---Mybatis 入门
一.Mybatis介绍 MyBatis是一款一流的支持自定义SQL.存储过程和高级映射的持久化框架.MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去设置参数和获取检索结果.MyBatis ...
- 微信公众号开发第二课 百度BAE搭建和数据库使用
上一节主要是一些准备知识,本课还是准备知识,开发微信也可以不使用数据库,但是要想搭建一些查询类应用,就可能使用到数据库操作,所以本节主要涉及到百度BAE上面的数据库表的创建,插入数据,修改数据,删除数 ...
- WPF小记——DockPanel使用不当引起界面显示问题
使用以下代码,当TextBlock文本过长,引起Button的显示位置在可见区域以外: <Window x:Class="WpfApplication11.MainWindow&quo ...
- 斜堆(三)之 Java的实现
概要 前面分别通过C和C++实现了斜堆,本章给出斜堆的Java版本.还是那句老话,三种实现的原理一样,择其一了解即可. 目录1. 斜堆的介绍2. 斜堆的基本操作3. 斜堆的Java实现(完整源码)4. ...
- [IR] Tolerant Retrieval & Spelling Correction & Language Model
Dictionary不一定是个list,它可以是多种形式. 放弃Hash的原因: 通常,tree是比较适合的结构. From: http://www.cnblogs.com/v-July-v/arch ...
- Nightwatch.js – 轻松实现浏览器的自动测试
Nightwatch.js 是一个易于使用的,基于 Node.js 平台的浏览器自动化测试解决方案.它使用强大的 Selenium WebDriver API 来在 DOM 元素上执行命令和断言. 语 ...