Stream流-分组操作

文章目录

  • Stream流-分组操作
    • 方法1-- groupingBy(Function)
    • 方法2-- groupingBy(Function,Collector)
    • 方法3-- groupingBy(Function,Supplier,Collector)

Collectors.groupingBy()3个方法的使用示例

/**员工* @author Yang* @create 2020-07-09 19:57*/
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() ....略@Overridepublic String toString() {return "Employee{" +"name='" + name + '\'' +", city='" + city + '\'' +", sales=" + sales +'}';}
}
    //-------------------生成测试数据---------------------private List<Employee> getEmps(){List<Employee> 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;}

方法1-- groupingBy(Function)

一个参数:一个分组器,使用提供的字段对集合元素进行分组,返回一个Map<字段,相同字段值的元素集>

    /***  groupBy方法1,groupingBy(Function)**  要求:先按city分组,每个分组里面是一个员工集合*/@Testpublic void test5(){List<Employee> emps = getEmps();Map<String, List<Employee>> map = emps.stream().collect(Collectors.groupingBy(Employee::getCity));map.forEach((key,val)->{System.out.println("城市:"+key+" ---员工集: "+val);});}/*** 城市:广州 ---员工集: [Employee{name='1', city='广州', sales=100}, Employee{name='5', city='广州', sales=20}, Employee{name='6', city='广州', sales=30}, Employee{name='8', city='广州', sales=30}]* 城市:上海 ---员工集: [Employee{name='0', city='上海', sales=30}]* 城市:杭州 ---员工集: [Employee{name='2', city='杭州', sales=50}, Employee{name='7', city='杭州', sales=30}]* 城市:北京 ---员工集: [Employee{name='3', city='北京', sales=30}, Employee{name='4', city='北京', sales=50}, Employee{name='9', city='北京', sales=30}]*/

方法2-- groupingBy(Function,Collector)

2个参数:一个是分组器,按提供的字段进行分组。一个收集器,下面举例了3种用途

    /***  groupBy方法2,groupingBy(Function,Collector)**  要求:先按city分组 ,再对组里面的成员,统计总销售额*/@Testpublic void test3(){List<Employee> emps = getEmps();for (Employee emp : emps) {System.out.println(emp);}Map<String, Integer> map = emps.stream().collect(Collectors.groupingBy(Employee::getCity, Collectors.summingInt(Employee::getSales)));//                                    先按city分组                                  再对组里面的成员,统计总销售额map.forEach((key,val)->{System.out.println("城市:"+key+" 销售总额:"+val);});}/*** Employee{name='0', city='上海', sales=50}* Employee{name='1', city='广州', sales=20}* Employee{name='2', city='广州', sales=30}* Employee{name='3', city='广州', sales=20}* Employee{name='4', city='杭州', sales=30}* Employee{name='5', city='杭州', sales=50}* Employee{name='6', city='北京', sales=50}* Employee{name='7', city='广州', sales=20}* Employee{name='8', city='杭州', sales=100}* Employee{name='9', city='广州', sales=30}* 城市:广州 销售总额:120* 城市:上海 销售总额:50* 城市:杭州 销售总额:180* 城市:北京 销售总额:50*/
    /*** groupBy方法2,groupingBy(Function,Collector)** 即:获取每个城市的姓氏集* 先按城市分组,再对每个组里面的员工姓名放入Set,得到每个城市的姓氏集*/@Testpublic void test4(){List<Employee> emps = getEmps();Map<String, Set<String>> map = emps.stream().collect(Collectors.groupingBy(Employee::getCity, Collectors.mapping(Employee::getName, Collectors.toSet())));map.forEach((key,val)->{System.out.println(""+key+" ---人员姓名: "+val);});}/*** 上海 ---人员姓名: [葛]* 广州 ---人员姓名: [张, 刘, 王]* 杭州 ---人员姓名: [杨, 刘, 葛]*/
    /*** groupBy方法2,groupingBy(Function,Collector)* 要求:每个城市中销售额最大的员工*      先按城市分组,在求分组里面销售额最大的员工*/@Testpublic void test6(){List<Employee> emps = getEmps();Map<String, Employee> 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);});}/*** Employee{name='杨', city='北京', sales=100}* Employee{name='杨', city='杭州', sales=20}* Employee{name='葛', city='深圳', sales=30}* Employee{name='张', city='上海', sales=50}* Employee{name='杨', city='广州', sales=50}* Employee{name='张', city='上海', sales=20}* Employee{name='张', city='上海', sales=50}* Employee{name='刘', city='北京', sales=50}* Employee{name='高', city='深圳', sales=100}* Employee{name='葛', city='深圳', sales=30}* 城市:广州 销售额最大员工:Employee{name='杨', city='广州', sales=50}* 城市:上海 销售额最大员工:Employee{name='张', city='上海', sales=50}* 城市:杭州 销售额最大员工:Employee{name='杨', city='杭州', sales=20}* 城市:深圳 销售额最大员工:Employee{name='高', city='深圳', sales=100}* 城市:北京 销售额最大员工:Employee{name='杨', city='北京', sales=100}*/

方法3-- groupingBy(Function,Supplier,Collector)

参数:一个分组器,一个最终类型的生产者,一个收集器

下面的示例:先按城市分组,然后收集每个城市的姓氏集,然后放入一个TreeMap,得到最终结果。(按城市名称排了序

   /*** 3个参数的方法:groupingBy(Function,Supplier,Collector)* 要求:要计算每个城市中人的姓氏集,并对城市名称进行排序* 先按城市分组,在对每个城市*/@Testpublic void test7(){List<Employee> emps = getEmps();TreeMap<String, Set<String>> 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);});}/*** 城市:上海 姓氏集:[刘]* 城市:北京 姓氏集:[宁, 李]* 城市:广州 姓氏集:[张, 高, 葛]* 城市:杭州 姓氏集:[张, 高, 葛]*/

Stream流-分组操作相关推荐

  1. Java8种Stream流相关操作——集合的筛选、归约、分组、聚合

    过滤.筛选   filter skip /*** 过滤 筛选*/@Testpublic void test2(){List<String> list = Arrays.asList(&qu ...

  2. Java 8 - Stream流骚操作解读2_归约操作

    文章目录 Pre 什么是归约操作 元素求和 reduce reduce如何运行的 最大值和最小值 Pre Java 8 - Stream流骚操作解读见到过的终端操作都是返回一个 boolean ( a ...

  3. JDK8新特性(三):集合之 Stream 流式操作

    1.Stream流由来 首先我们应该知道:Stream流的出现,主要是用在集合的操作上.在我们日常的工作中,经常需要对集合中的元素进行相关操作.诸如:增加.删除.获取元素.遍历. 最典型的就是集合遍历 ...

  4. Java8 Stream流式操作接口详解

    stream是用于集合使用的流式操作,可使用collection.stream获取流 default Stream<E> stream() {return StreamSupport.st ...

  5. Java 8 - Stream流骚操作解读

    文章目录 分类 中间操作 终端操作 使用Stream流 筛选和切片 用谓词筛选 filter 筛选各异的元素 distinct 截短流 limit 跳过元素 skip 映射 对流中每一个元素应用函数 ...

  6. Java8 的 Stream 流式操作之王者归来

    相对于Java8之前的Java的相关操作简直是天差地别,Java8 的流式操作的出现,也很大程度上改变了开发者对于Java的繁琐的操作的印象,从此,Java也走向了函数式编程的道路! 1 流的创建 1 ...

  7. jdk8新特性(二)Stream流式操作

    1.流处理过程 2.Stream流式分类 Stream,IntStream,LongStream,DoubleStream 3.操作符 Stream 的一系列操作必须要使用终止操作,否者整个数据流是不 ...

  8. Stream流分组求和

    有这么个需求,要计算每个年龄的总分数:如果是用sql的话直接用sql执行,现在用代码执行: 我要求出每个部门的总分数 List<User> list = userService.getUs ...

  9. java8中的Stream流式操作总结,List转Map或List转LinkedHashMap使用Collectors.groupingBy用法

    前言背景描述: 开发使用本来是直接使用数据库的依据SQL进行group By获取到数据表的分组的一个字段的字符串,可是后来字符串越来越多越长,导致的最后的后面长度超多1024个汉字就会被截取,所以需要 ...

最新文章

  1. flannel 概述 - 每天5分钟玩转 Docker 容器技术(58)
  2. 【OpenCV学习】内存分配讨论两例
  3. 使用驱动调试助手应该注意的问题
  4. java.util.Map中put,computeIfAbsent与putIfAbsent区别
  5. Symantec Backup Exec 2014 备份Exchange 2013之二安装主备服务器
  6. python随机画圆_python生成随机图形验证码详解
  7. django03_表单(forms.ModelForm)(login前后台)
  8. visual studio code(vs code) 编译、运行、调试程序(调用g++)
  9. OSChina 周六乱弹 —— 表白有风险,装逼需谨慎
  10. 织梦 - PHP开源网站管理系统
  11. python微信抢红包脚本_这个Python脚本牛逼了,秒抢红包就算了,还能无视撤回消息...
  12. 乐优商城项目实战视频教程
  13. 电子计算机eniac的储存能力有限 只能,电子计算机ENIAC的存储能力有限,只能存储简单的控制程序代码。...
  14. 数据库理论第八章部分作业——基于《数据库系统概念》第七版
  15. 我的嵌入式软件工程师秋招之路(文末送福利)
  16. 什么是CPS?数字孪生技术在工业4.0该如何应用?ThingJS
  17. redhat linux 历史版本,redhat-linux操作系统版本发展史
  18. 数字后端基本概念介绍Tie cell
  19. 学习Ajax框架之dojo:第六节——dojo类的声明和继承(附源代码)
  20. 谷底飞龙的技术博客集

热门文章

  1. 微信二维码1-服务号推广(将网页存储为图片存储到服务器)
  2. spss 通径分析_使用SPSS线性回归实现通径分析的方法-学习资料.pdf
  3. Unity教程 | 手把手教你拼一个3D“魔方”
  4. 【mongoDB】一一一一安装报错1058解决方案
  5. css竖向箭头符号_如何用css实现三角形符号代码
  6. 柠檬班性能测试day3_性能测试基础知识(0521)
  7. 发光字招牌制作底板的种类
  8. Java利用JNA调用C#的dll
  9. 数据库根据身份证号码判别性别
  10. win7已经阻止此发行者在您的计算机上运行软件,Win7系统提示无法验证发布者windows已阻止软件的解决方法教程[多图]...