JDK1.8聚合操作
在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);
}
}
JDK1.8聚合操作的更多相关文章
- 《Entity Framework 6 Recipes》中文翻译系列 (27) ------ 第五章 加载实体和导航属性之关联实体过滤、排序、执行聚合操作
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-9 关联实体过滤和排序 问题 你有一实体的实例,你想加载应用了过滤和排序的相关 ...
- MongoDB 聚合操作
在MongoDB中,有两种方式计算聚合:Pipeline 和 MapReduce.Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多台Server上并行执行复 ...
- .NET LINQ 聚合操作
聚合操作 聚合运算从值集合计算单个值. 从一个月的日温度值计算日平均温度就是聚合运算的一个示例. 方法 方法名 说明 C# 查询表达式语法 Visual Basic 查询表达式语法 更多信息 ...
- Linq查询操作之聚合操作(count,max,min,sum,average,aggregate,longcount)
在Linq中有一些这样的操作,根据集合计算某一单一值,比如集合的最大值,最小值,平均值等等.Linq中包含7种操作,这7种操作被称作聚合操作. 1.Count操作,计算序列中元素的个数,或者计算满足一 ...
- OpenStack/Gnocchi简介——时间序列数据聚合操作提前计算并存储起来,先算后取的理念
先看下 http://www.cnblogs.com/bonelee/p/6236962.html 这里对于环形数据库的介绍,便于理解归档这个操作! 转自:http://blog.sina.com.c ...
- ElasticSearch 学习记录之ES几种常见的聚合操作
ES几种常见的聚合操作 普通聚合 POST /product/_search { "size": 0, "aggs": { "agg_city&quo ...
- MongoDB 基本操作和聚合操作
一 . MongoDB 基本操作 基本操作可以简单分为查询.插入.更新.删除. 1 文档查询 作用 MySQL SQL MongoDB 所有记录 SELECT * FROM users; db ...
- Lambda表达式-聚合操作
文章参考自博客:https://www.cnblogs.com/franson-2016/p/5593080.html 以及学习网站:how2java.cn 1.传统方式和聚合操作遍历数据的不同 传统 ...
- elasticsearch聚合操作——本质就是针对搜索后的结果使用桶bucket(允许嵌套)进行group by,统计下分组结果,包括min/max/avg
分析 Elasticsearch有一个功能叫做聚合(aggregations),它允许你在数据上生成复杂的分析统计.它很像SQL中的GROUP BY但是功能更强大. 举个例子,让我们找到所有职员中最大 ...
随机推荐
- Android内存优化之——static使用篇
在Android开发中,我们经常会使用到static来修饰我们的成员变量,其本意是为了让多个对象共用一份空间,节省内存,或者是使用单例模式,让该类只生产一个实例而在整个app中使用.然而在某些时候不恰 ...
- hadoop多机安装HA+YARN
HA 相比于Hadoop1.0,Hadoop 2.0中的HDFS增加了两个重大特性,HA(热备)和Federation(联邦).HA即为High Availability,用于解决NameNode单点 ...
- Android推送通知指南
Android推送通知指南 在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是 ...
- JS判断浏览器是否支持某一个CSS3属性
1.引子 css3的出现让浏览器的表现更加的丰富多彩,表现冲击最大的就是动画了,在日常书写动画的时候,很有必要去事先判断浏览器是否支持,尤其是在写CSS3动画库的时候.比如transition的ani ...
- C#数据库连接字符串
转自:http://blog.csdn.net/xiaokexinger/article/details/1541441 在MSDN中,.net的数据库连接字符串都有详细的说明,我这里以代码范例的方式 ...
- 基础算法(二分,贪心):NOIP 2012 疫情控制
题目大意 给出一棵n个节点的树,根是1,要在除根节点以外的点建立检查点,使得从每条根到叶子的路径上都至少存在一个检查点.检查点由军队来建立.初始军队的位置是给定的,移动军队走一条边需要花费这条边的权值 ...
- MySqlCommand, MySqlParameter and "LIKE" with Percent Symbol
//Wrong way MySqlCommand cmd = oldDb.GetSqlStringCommand(CommandType.Text,"SELECT * _ FROM user ...
- C# json
C# 解析 json JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集. JSON采用完全独立于语言的 ...
- Windows游戏编程之从零开始d
Windows游戏编程之从零开始d I'm back~~恩,几个月不见,大家还好吗? 这段时间真的好多童鞋在博客里留言说或者发邮件说浅墨你回来继续更新博客吧. woxiangnifrr童鞋说每天都在来 ...
- NIO的学习
参考 http://wenku.baidu.com/link?url=rq-BEp3Et4JRrE62f2Lv9hq8nT_Gq0XPb65h8OBqTAt-ILfqKmdjIhVEp8bctIdm0 ...