李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
三、Stream流分组操作
Leefs
2021-05-11 PM
1233℃
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://www.lilinchao.com/archives/1250.html
上一篇
二、Stream流操作API
下一篇
复制菜单树形结构信息
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
工具
MyBatisX
ajax
排序
前端
机器学习
MyBatis-Plus
Docker
Tomcat
Java
SpringBoot
Java编程思想
Redis
Kafka
NIO
正则表达式
JVM
Beego
DataX
Quartz
Spark Streaming
Flume
Spark SQL
锁
Git
ClickHouse
SQL练习题
微服务
二叉树
Hadoop
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞