java8 streams_Java 8 Streams API:对流进行分组和分区
java8 streams
这篇文章展示了如何使用Streams API中可用的Collectors
将具有groupingBy
的流元素和具有partitioningBy
的流元素进行groupingBy
。
考虑一系列Employee
对象,每个对象都有名称,城市和销售数量,如下表所示:
+----------+------------+-----------------+
| Name | City | Number of Sales |
+----------+------------+-----------------+
| Alice | London | 200 |
| Bob | London | 150 |
| Charles | New York | 160 |
| Dorothy | Hong Kong | 190 |
+----------+------------+-----------------+
分组
让我们开始使用命令式(Java-Lamba)按城市对员工进行分组:
Map<String, List<Employee>> result = new HashMap<>();
for (Employee e : employees) {String city = e.getCity();List<Employee> empsInCity = result.get(city);if (empsInCity == null) {empsInCity = new ArrayList<>();result.put(city, empsInCity);}empsInCity.add(e);
}
您可能熟悉这样的代码编写,并且您可以看到,完成如此简单的任务需要很多代码!
在Java 8中,您可以使用groupingBy
收集器对单个语句执行相同的操作,如下所示:
Map<String, List<Employee>> employeesByCity =employees.stream().collect(groupingBy(Employee::getCity));
结果如下图:
{New York=[Charles], Hong Kong=[Dorothy], London=[Alice, Bob]}
通过将counting
收集器传递给groupingBy
收集器,还可以计算每个城市的雇员counting
。 第二收集器对分类为同一组的流中的所有元素执行进一步的还原操作。
Map<String, Long> numEmployeesByCity =employees.stream().collect(groupingBy(Employee::getCity, counting()));
结果如下图:
{New York=1, Hong Kong=1, London=2}
顺便说一句,这等效于以下SQL语句:
select city, count(*) from Employee group by city
另一个示例是计算每个城市的平均销售数量,可以使用averagingInt
收集器结合groupingBy
收集器来完成:
Map<String, Double> avgSalesByCity =employees.stream().collect(groupingBy(Employee::getCity,averagingInt(Employee::getNumSales)));
结果如下图:
{New York=160.0, Hong Kong=190.0, London=175.0}
分区
分区是一种特殊的分组,其中的结果映射最多包含两个不同的组-一个用于true
,一个用于false
。 例如,如果您想找出最好的员工是谁,则可以使用partitioningBy
收集器将他们分为销售额超过N的员工和销售额不超过N的员工。
Map<Boolean, List<Employee>> partitioned =employees.stream().collect(partitioningBy(e -> e.getNumSales() > 150));
这将产生以下结果:
{false=[Bob], true=[Alice, Charles, Dorothy]}
您还可以通过将groupingBy
收集器传递给partitioningBy
收集器来组合分区和分组。 例如,您可以计算每个分区内每个城市的雇员人数:
Map<Boolean, Map<String, Long>> result =employees.stream().collect(partitioningBy(e -> e.getNumSales() > 150,groupingBy(Employee::getCity, counting())));
这将产生一个两层的Map:
{false={London=1}, true={New York=1, Hong Kong=1, London=1}}
翻译自: https://www.javacodegeeks.com/2015/11/java-8-streams-api-grouping-partitioning-stream.html
java8 streams
java8 streams_Java 8 Streams API:对流进行分组和分区相关推荐
- java8 streams_Java 8 Streams API作为友好的ForkJoinPool外观
java8 streams 我最喜欢Java 8的功能之一是流API. 最终,它消除了代码中的几乎所有循环,并使您可以编写更具表现力和重点的代码. 今天,我意识到它可以用于其他用途:作为ForkJoi ...
- Java 8 Streams API:对流进行分组和分区
这篇文章展示了如何使用Streams API中可用的Collectors将具有groupingBy的流元素和具有partitioningBy的流元素进行groupingBy . 考虑一系列Employ ...
- java8 streams_Java 8 Streams:过滤和谓词否定
java8 streams 最近,有关LJC 邮件列表的成员在流中.filter方法中使用谓词否定的有趣讨论,因此我认为值得在博客文章中进行总结. 讨论是关于使用.filter和否定谓词的方法. 这篇 ...
- java8 streams_Java 8 Friday:使用Streams API时的10个细微错误
java8 streams 在Data Geekery ,我们喜欢Java. 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋. ...
- 一点杂感 以及 java8 Streams API 与 C# Linq 简要对比分析
写在前面的一点小吐槽.一点杂感 学 Haskell 学了一段时间之后,虽说拿他来写东西还是完全不行,但是看别的语言特性时,总是会带着一种"诶,这玩意在哪哪见过"的蜜汁既视感.且不说 ...
- java8 streams_当Java 8 Streams API不够用时
java8 streams Java 8与往常一样是妥协和向后兼容的版本. JSR-335专家组可能尚未与某些读者就某些功能的范围或可行性达成一致的版本 . 请参阅Brian Goetz关于为什么-的 ...
- 当Java 8 Streams API不够用时
Java 8与往常一样是妥协和向后兼容的版本. JSR-335专家组可能无法与某些读者就某些功能的范围或可行性达成一致的发行版. 请参阅Brian Goetz关于为什么-的一些具体解释. -Java ...
- Java 9 揭秘(18. Streams API 更新)
Tips 做一个终身学习的人. 在本章中,主要介绍以下内容: 在Stream接口中添加了更加便利的方法来处理流 在Collectors类中添加了新的收集器(collectors) JDK 9中,在St ...
- Streams API
Streams API允许JavaScript以编程的方式访问通过网络接收的数据流,并根据开发人员的需要处理它们. 概念和用法 流将你希望通过网络接收的资源拆分成小块,然后按位处理它.这正是浏览器在接 ...
最新文章
- Redis启动多端口,运行多实例(转)
- Collections接口下的Comparetor类和Comparable接口排序
- layui表格合并单元格多表_layui动态表格之合并单元格
- PostgreSQL学习笔记6之函数和操作符二
- 各种URL生成方式的性能对比
- 面试官通过21天步数考察候选人诚意,结果拒了清华生收了三本生
- 字符串转换成整数 php,php如何将字符串转为整数
- 计算机网络实验传输文件,湖大计算机网络实验-tcp文件传输实验
- 一个demo学会css
- python基础===open()文件处理使用介绍
- HTTP_X_FORWARDED_FOR 和 REMOTE_ADDR 的区别
- 一种改进的樽海鞘群算法-附代码
- 南京邮电大学c语言实验报告4,南京邮电大学软件设计实验报告..doc
- 输出100以内的素数
- Java使用多线程,UPD通过控制台之间互相通讯
- 台式机主板常见接口资料
- 重庆云阳2021云中高考成绩查询,2021年云阳县高考状元是谁及其成绩名单
- 跟着我学习 AI丨语音识别:将语音转为数字信号
- 调用第三方接口的方式(简洁版)
- MATLAB去读网页源码时中文乱码