Collector收集器的高级用法

Collectors收集器的高级用法

pexels-pixabay-265631

 

场景1:获取关联的班级名称

原先如果需要通过关联字段拿到其他表的某个字段,只能遍历List匹配获取

for (Student student : studentList) {Long clazzId = student.getClazzId();// 遍历班级列表,获取学生对应班级名称for (Clazz clazz : clazzList) {if(ObjectUtil.equal(clazzId, clazz.getClazzId())) {student.setClazzName(clazz.getClazzName());break;}}
}

但是如果使用 toMap 方法,可以一步到位,代码的可读性是不是要比上面那种方式好很多?

Map<Long, String> clazzMap = clazzList.stream().collect(Collectors.toMap(Clazz::getClazzId, Clazz::getClazzName));
// 使用Map进行匹配,直接通过get方法获取班级名称
studentList.forEach(i -> i.setClazzName(clazzMap.get(i.getClazzId())));

如果你想关联整个对象而不是某个字段,也没关系,可以像下面这样

Map<Long, Clazz> clazzMap = clazzList.stream().collect(Collectors.toMap(Clazz::getClazzId, Function.identity()));
// 使用Map关联班级对象
studentList.forEach(i -> i.setClazz(clazzMap.get(i.getClazzId())));

 

场景2:统计图书的借阅次数

有一些时候,我们需要对列表的数据做一些统计,比如图书的借阅次数,活动的参与人数等,这些统计可以通过循环手动遍历进行计算

for (BookInfo bookInfo : bookList) {long borrowNumber = 0L;Long bookId = bookInfo.getBookId();for (BorrowRecord record : recordList) {// 次数+1if(ObjectUtil.equal(bookId, record.getBookId())) {borrowNumber ++;}}bookInfo.setBorrowNumber(borrowNumber);
}

上面的这种写法其实还好,但是业务如果复杂一些的话,写起来就比较麻烦了,但是如果使用 toMap 方法,可以一步到位

Map<Long, Long> numberMap = recordList.stream().collect(Collectors.toMap(BorrowRecord::getBookId, e -> 1L, Long::sum));
// 统计图书的借阅次数
bookList.forEach(i -> i.setBorrowNumber(numberMap.get(i.getBookId())));

 

场景3:根据城市分组,查看城市都有哪些姓氏的人

有些业务场景比较复杂,需要对我们对数据进行分组统计,这些情况下,就需要用到 groupingBy() 方法了

Map<City, Set<String>> lastNamesByCity= people.stream().collect(Collectors.groupingBy(Person::getCity,Collectors.mapping(Person::getLastName, Collectors.toSet())));

上面的方法,其实不是唯一的写法,我们还可以这样写

Map<City, Set<String>> lastNamesByCity= people.stream().collect(Collectors.groupingBy(Person::getCity,Collectors.flatMapping((i) -> Stream.of(i.getLastName()), Collectors.toSet())));

Map 也可以间接实现分组的效果,让我们换成 toMap() 方法试试

Map<City, Set<String>> lastNamesByCity= people.stream().collect(Collectors.toMap(Person::getCity, (v) -> {Set<String> set = Sets.newHashSet();set.add(v.getLastName());return set;},(a, b) -> {(a).addAll(b);return a;}, HashMap::new));

另外,如果最后的统计不要求姓氏写成集合,那么我们还可以写成这样

 Map<City, String> lastNamesByCity= people.stream().collect(Collectors.toMap(Person::getCity,Person::getLastName, (a, b) -> a + "," + b));

能看得出来,在分组这件事上,groupingBy() 方法更适合,使用 toMap() 方法虽然也能实现,但是写出的代码会更复杂。

 

场景4:根据客户名称分组,查看订单都有哪些商品

如果需要做购物商城一类的项目,那么必然就离不开订单、用户和商品,根据客户统计订单商品,也是一个非常复杂的业务逻辑,因此这里我们可以用到 groupingBy() 方法

Map<String, Set<Product>> productsByCustomerName= orders.stream().collect(Collectors.groupingBy(Order::getCustomName,Collectors.flatMapping(order -> order.getProducts().stream(),Collectors.toSet())));

让我们换一种写法试试

Map<String, Set<Product>> productsByCustomerName= orders.stream().collect(Collectors.groupingBy(Order::getCustomName,Collectors.collectingAndThen(Collectors.toSet(),i -> i.stream().flatMap(p -> p.getProducts().stream()).collect(Collectors.toSet()))));

换成 toMap() 如何

Map<String, Set<Product>> productsByCustomerName= orders.stream().collect(Collectors.toMap(Order::getCustomName,(v) -> Sets.newHashSet(v.getProducts()),(a, b) -> {(a).addAll(b);return a;})
);

 

场景5:根据部门分组,查看工资大于2000的员工

说到部门,那就不得不提到人员,对人员的各种信息进行统计,我们依然可以使用 groupingBy() 方法

Map<Department, Set<Employee>> wellPaidEmployeesByDepartment= employees.stream().collect(Collectors.groupingBy(Employee::getDepartment,Collectors.filtering(e -> e.getSalary() > 2000,Collectors.toCollection(HashSet::new))));

同样地,如果你喜欢使用 toMap(),也可以像下面这样写

Map<Department, Set<Employee>> wellPaidEmployeesByDepartment= employees.stream().filter(e -> e.getSalary() > 2000).collect(Collectors.toMap(Employee::getDepartment,Sets::newHashSet,(a, b) -> {(a).addAll(b);return a;}));

 

场景6:区分及格和不及格的学生

统计学生的成绩是一大麻烦事,很多数据需要统计到,但如果只是区分及格和不及格的学生,这里我们可以使用 partitioningBy() 方法,将学生分为两个区间

 Map<Boolean, List<Student>> passingFailing = students.stream().collect(Collectors.partitioningBy(s -> s.getGrade() >= DataUtils.PASS_THRESHOLD));

partitioningBy 相当于另一种版本的 groupingBy,但是数据最多只有两组,因为 partitioningBy 是通过指定的条件进行分组的,满足的在一边,不满足的在另一边。

 

场景7:同时统计订单数以及综合评分

JDK12 开始,Collectors 新增了一个方法 teeing,直译为发球,这样翻译可能听不太懂,但我给你看一下怎么用,你就知道了

Pair<Map<Long, Long>, Map<Long, Double>> pair = orderList.stream().collect(Collectors.teeing(Collectors.groupingBy(BookOrder::getHotelId, Collectors.counting()),Collectors.groupingBy(BookOrder::getHotelId, Collectors.averagingDouble(BookOrder::getOrderRating)),Pair::of));
  Collectors.groupingBy(BookOrder::getHotelId, Collectors.counting()),Collectors.groupingBy(BookOrder::getHotelId, Collectors.averagingDouble(BookOrder::getOrderRating)),Pair::of));

是的,teeing 方法接收两个参数,这两个参数分别会得出一个结果,把两个结果再进行处理,就是第三个参数,就这么简单。利用这个方法我们可以分别统计两个结果(比如最值,平均数)并对这两个结果再进行处理,非常好用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/227067.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

隐身之术:深入解析代理模式的神秘力量

一、定义 代理模式&#xff08;Proxy Pattern)为其他对象提供一种代理以控制对这个对象的访问,属于结构型模式。 二、解决什么问题 主要解决在直接访问对象时带来的问题&#xff0c;比如说&#xff1a;要访问的对象在远程的机器上。在面向对象系统中&#xff0c;有些对象由于…

一篇文章深入认识微服务SpringCloud和Dubbo的区别

1、SpringCloud是什么 SpringCloud, 基于SpringBoot提供了一套微服务解决方案&#xff0c;包括服务注册与发现&#xff0c;配置中心&#xff0c;全链路监控&#xff0c;服务网关&#xff0c;负载均衡&#xff0c;熔断器等组件&#xff0c;除了基于NetFlix的开源组件做高度抽象…

Conda:Python环境管理的瑞士军刀

在数据科学和机器学习的世界中&#xff0c;管理各种库和依赖关系的重要性不容忽视。Conda 就是为此而生的强大工具。本文将深入探讨 Conda 的简介、功能以及使用示例&#xff0c;帮助你更好地理解和使用这个工具。 Conda 简介 Conda 是一个开源的包管理系统和环境管理系统&am…

新品出击 | 软网关BLIoTLink免费发布

新品出击|软网关BLIoTLink免费发布 BLIoTLink是一款免费的物联网协议转换软件&#xff0c;可以部署在任何基于Linux OS的系统&#xff08;Linux、Debian、Ubuntu、FreeRTOS、RT-Thread&#xff09;中&#xff0c;使用灵活&#xff0c;可以实现数据的采集以及接入网络平台。 BL…

0开始配置Cartographer建图和导航定位

0开始配置Cartographer 日期&#xff1a;12-19 硬件&#xff1a;激光雷达IMU 小车的tf变换&#xff1a; 建图配置 lua文件配置&#xff1a;my_robot.lua include "map_builder.lua" include "trajectory_builder.lua"options {map_builder MAP_BUILDE…

HarmonyOS page生命周期函数讲解

下面 我们又要看一个比较重要的点了 页面生命周期 页面组件有三个生命周期 onPageShow 页面显示时触发 onPageHide 页面隐藏时触发 onBackPress 页面返回时触发 这里 我们准备两个组件 首先是 index.ets 参考代码如下 import router from ohos.router Entry Component struc…

Python FastApi连接oracle进行查询

这边技术选型是cx_oracle进行连接查询&#xff0c;cx_oracle的使用首先要有官方的客户端才能连接到数据库&#xff0c;python并不自带客户端。我用是Python3.9 安装客户端 可以到官网在选择最新版进行下载。 Instant Client for Microsoft Windows (x64) 64-bit 或者直接从我…

HBase深度历险 | 京东物流技术团队

简介 HBase 的全称是 Hadoop Database&#xff0c;是一个分布式的&#xff0c;可扩展&#xff0c;面向列簇的数据库&#xff0c;是一个通过大量廉价的机器解决海量数据的高速存储和读取的分布式数据库解决方案。本文会像剥洋葱一样&#xff0c;层层剥开她的心。 特点 首先我…

【机器学习】深度学习概论(二)

五、受限玻尔兹曼机&#xff08;Restricted Boltzmann Machine&#xff0c;RBM&#xff09; 5.1 RBM介绍 示例代码&#xff1a; Python 编写了一个简单的 RBM 实现&#xff0c;并用一些假数据训练了它。然后&#xff0c;他展示了如何用 RBM 来解释用户的电影偏好&#xff0c;以…

MySQL MVCC精讲

版本链 我们前面说过&#xff0c;对于使用InnoDB存储引擎的表来说&#xff0c;它的聚簇索引记录中都包含两个必要的隐藏列&#xff08;row_id并不是必要的&#xff0c;我们创建的表中有主键或者非NULL的UNIQUE键时都不会包含row_id列&#xff09;&#xff1a; trx_id&#xff…

[ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择

文章目录 一、前言二、Amazon SNS 服务&#xff08;Amazon Simple Notification Service&#xff09;三、Amazon SQS 服务&#xff08;Amazon Simple Queue Service&#xff09;四、SNS 与 SQS 的区别&#xff08;本文重点&#xff09;4.1 基于推送和轮询区别4.2 消费者数量对应…

Hadoop之Yarn 详细教程

1、yarn 的基本介绍和产生背景 YARN 是 Hadoop2 引入的通用的资源管理和任务调度的平台&#xff0c;可以在 YARN 上运行 MapReduce、Tez、Spark 等多种计算框架&#xff0c;只要计算框架实现了 YARN 所定义的 接口&#xff0c;都可以运行在这套通用的 Hadoop 资源管理和任务调…

[足式机器人]Part4 南科大高等机器人控制课 CH12 Robotic Motion Control

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;CLEAR_LAB 笔者带更新-运动学 课程主讲教师&#xff1a; Prof. Wei Zhang 课程链接 &#xff1a; https://www.wzhanglab.site/teaching/mee-5114-advanced-control-for-robotics/ 南科大高等机器人控制课 Ch12 Robotic …

uni-appcss语法

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

PPT录制视频的方法,轻松提升演示效果!

在现代工作和学习中&#xff0c;ppt是一种常见的演示工具&#xff0c;而将ppt转化为视频形式更能方便分享和传播。本文将介绍两种ppt录制视频的方法&#xff0c;每一种方法都将有详细的步骤和简要的介绍&#xff0c;通过这些方法&#xff0c;你可以轻松将ppt制作成视频&#xf…

秋招复习篇之代码规范

目录 前言 1、变量命名 2、代码空格 1&#xff09;操作符左右一定有空格&#xff0c; 2&#xff09;分隔符&#xff08;, 和;&#xff09;前一位没有空格&#xff0c;后一位保持空格&#xff0c;例如&#xff1a; 3&#xff09;大括号和函数保持同一行&#xff0c;并有一个空格…

双语!性能优越|融合黏菌和差分变异的量子哈里斯鹰算法SDMQHHO

前面的文章里卡卡介绍了哈里斯鹰优化算法(Harris Hawks Optimization, HHO).HHO是 Heidari等[1]于2019年提出的一种新型元启发式算法&#xff0c;设计灵感来源于哈里斯鹰在捕食猎物过程中的合作行为以及突然袭击的狩猎风格&#xff0c;具有需调参数少、原理简单易实现、局部搜索…

4.20 构建onnx结构模型-Reduce

前言 构建onnx方式通常有两种&#xff1a; 1、通过代码转换成onnx结构&#xff0c;比如pytorch —> onnx 2、通过onnx 自定义结点&#xff0c;图&#xff0c;生成onnx结构 本文主要是简单学习和使用两种不同onnx结构&#xff0c; 下面以 Reduce 结点进行分析 方式 方法…

002文章解读与程序——中国电机工程学报EI\CSCD\北大核心《计及源荷不确定性的综合能源生产单元运行调度与容量配置两阶段随机优化》已提供下载资源

&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;下载资源链接&#x1f4…

Java——猫猫图鉴微信小程序(前后端分离版)

目录 一、开源项目 二、项目来源 三、使用框架 四、小程序功能 1、用户功能 2、管理员功能 五、使用docker快速部署 六、更新信息 审核说明 一、开源项目 猫咪信息点-ruoyi-cat: 1、一直想做点项目进行学习与练手&#xff0c;所以做了一个对自己来说可以完成的…