李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
三、Stream流分组操作
Leefs
2021-05-11 PM
1663℃
0条
# 03.Stream流分组操作 ### 前言 `groupingBy()`是Stream API中最强大的收集器Collector之一,提供与SQL的GROUP BY子句类似的功能。 ### 一、Stream流-分组操作 + groupingBy(Function) > 一个参数:一个分组器,使用提供的字段对集合元素进行分组,返回一个`Map<字段,相同字段值的元素集>` + groupingBy(Function,Collector) > 两个参数:一个是分组器,按提供的字段进行分组,一个收集器 + groupingBy(Function,Supplier,Collector) > 三个参数:一个分组器,一个最终类型的生产者,一个收集器 ### 二、使用示例 > 背景:根据公司职员的姓、所在城市、以及销售额进行统计 **实体类Employee** ```java public class Employee { private String name; // 姓 private String city; // 城市 private Integer sales; // 销售额 public Employee(String name, String city, Integer sales) { this.name = name; this.city = city; this.sales = sales; } public Employee(String city, Integer sales) { this.city = city; this.sales = sales; } public Employee() { } // getter(),setter() ....略 @Override public String toString() { return "Employee{" + "name='" + name + '\'' + ", city='" + city + '\'' + ", sales=" + sales + '}'; } } ``` **生成测试数据** ```java private List
getEmps(){ List
list = new ArrayList<>(); Random rd = new Random(); String[] citys = {"北京","上海","广州","杭州","深圳"}; String[] firstName = {"张","李","杨","宁","刘","王","高","葛"}; Integer[] sales = {100,50,30,20}; for (int i = 0; i < 10; i++) { String city = citys[rd.nextInt(5)]; Integer sale = sales[rd.nextInt(4)]; String fname = firstName[rd.nextInt(firstName.length)]; list.add(new Employee(fname,city,sale)); } return list; } ``` #### 2.1 groupingBy(Function)方法使用 > *要求:先按city分组,每个分组里面是一个员工集合* ```java public void test5(){ List
emps = getEmps(); Map
> map = emps.stream().collect(Collectors.groupingBy(Employee::getCity)); map.forEach((key,val)->{ System.out.println("城市:"+key+" ---员工集: "+val); }); } ``` #### 2.2 groupingBy(Function,Collector)方法使用 > *要求:先按city分组 ,再对组里面的成员,统计总销售额* ```java public void test3(){ List
emps = getEmps(); for (Employee emp : emps) { System.out.println(emp); } Map
map = emps.stream(). collect(Collectors.groupingBy(Employee::getCity, Collectors.summingInt(Employee::getSales))); map.forEach((key,val)->{ System.out.println("城市:"+key+" 销售总额:"+val); }); } ``` > *即:获取每个城市的姓氏集* > > *先按城市分组,再对每个组里面的员工姓名放入Set,得到每个城市的姓氏集* ```java public void test4(){ List
emps = getEmps(); Map
> map = emps.stream().collect(Collectors.groupingBy(Employee::getCity, Collectors.mapping(Employee::getName, Collectors.toSet()))); map.forEach((key,val)->{ System.out.println(""+key+" ---人员姓名: "+val); }); } ``` > *要求:每个城市中销售额最大的员工* > > *先按城市分组,在求分组里面销售额最大的员工* ```java public void test6(){ List
emps = getEmps(); //接受一个函数作为参数,从类型T中提取一个int排序键,并返回一个与该排序键进行比较的Comparator。返回的比较器可以序列化。 Map
map = emps.stream().collect(Collectors.groupingBy(Employee::getCity, Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparingInt(Employee::getSales)), Optional::get))); map.forEach((key,val)->{ System.out.println("城市:"+key+" 销售额最大员工:"+val); }); } ``` #### 2.3 groupingBy(Function,Supplier,Collector)方法使用 > *要求:要计算每个城市中人的姓氏集,并对城市名称进行排序* > > *先按城市分组,在对每个城市* ```java public void test7(){ List
emps = getEmps(); /** * Set:进行去重 * Collectors.toSet():将结果汇总为Set集合 */ TreeMap
> map = emps.stream().collect(Collectors.groupingBy(Employee::getCity, TreeMap::new, Collectors.mapping(Employee::getName, Collectors.toSet()))); map.forEach((key,val)->{ System.out.println("城市:"+key+" 姓氏集:"+val); }); } ``` **mapping收集器接收两个参数:** 第一个参数是lambda表达式,用来进行属性转换。 第二个参数是一个收集器,用来收集汇总第一个参数的lambda表达式的结果。 *附:* [参考原文链接地址](https://blog.csdn.net/qq_42701294/article/details/107291917)
标签:
Stream流
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/1250.html
上一篇
二、Stream流操作API
下一篇
复制菜单树形结构信息
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
Flink
数据结构
Zookeeper
GET和POST
Thymeleaf
JavaScript
MyBatisX
Beego
高并发
Hbase
JavaSE
Stream流
查找
Java
HDFS
FastDFS
数据结构和算法
BurpSuite
Docker
Hive
前端
Spark SQL
Filter
散列
Livy
SpringCloudAlibaba
SQL练习题
Jenkins
Elasticsearch
机器学习
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭