当前位置: 首页 > news >正文

Java中Stream使用示例-对实体List分组且保留原数据顺序并对分组后的每组内的数据进行部分业务逻辑修改操作

场景

Java8新特性-Stream对集合进行操作的常用API:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126070657

针对Stream的一个常用的业务场景:

对实体List分组且保留原数据顺序并对分组后的每组内的数据进行部分业务逻辑修改操作

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi 

实现

先看代码实现:

        Map<String, List<WarehouseTankInfoDTO>> dataMap = dataList.stream().collect(Collectors.groupingBy(WarehouseTankInfoDTO::getRelateCompanyName,LinkedHashMap::new, // 保持插入顺序Collectors.collectingAndThen(Collectors.toList(),list -> {// 对每组List<WarehouseTankInfoDTO>进行逻辑处理return list.stream().peek(dto -> {// 示例:修改DTO的某个字段if (null != dto.getStoreName()&& null!=dto.getRelateCompanyName()&& !dto.getStoreName().equals(dto.getRelateCompanyName()) ) {dto.setStoreName(dto.getRelateCompanyName());}}).collect(Collectors.toList());})));

代码详细讲解:

1. 基础结构

Map<String, List<WarehouseTankInfoDTO>> dataMap = dataList.stream().collect(Collectors.groupingBy(...));

核心逻辑:按公司名称分组并保持原始顺序

2、分组逻辑实现

groupingBy(WarehouseTankInfoDTO::getRelateCompanyName, // 分组Key提取器LinkedHashMap::new, // Map实现类选择Collectors.collectingAndThen(...)  // 下游收集器
)

LinkedHashMap::new

保证分组后的Map键顺序与数据原始出现顺序一致(普通HashMap不保证顺序)

典型应用场景:需要按特定顺序展示分组结果的报表生成

3、分组后处理

Collectors.collectingAndThen(Collectors.toList(),list -> {return list.stream().peek(dto -> {// 字段修正逻辑if (null != dto.getStoreName()  &&null != dto.getRelateCompanyName()  &&!dto.getStoreName().equals(dto.getRelateCompanyName()))  {dto.setStoreName(dto.getRelateCompanyName());}}).collect(Collectors.toList());}
)

双阶段处理:

先执行常规toList()收集

然后对每个分组List进行流式处理

字段修正逻辑:

当storeName与relateCompanyName不同且非空时

用relateCompanyName覆盖storeName

业务意图:统一相同公司下的仓库名称标准

4、注意这里的peek的用法

方法定义

Stream<T> peek(Consumer<? super T> action)

类型:中间操作(Intermediate Operation)

参数:接收一个Consumer函数式接口

返回值:返回新的Stream(支持链式调用)

典型用途

调试观察:查看流处理中间状态

副作用操作:修改元素内部状态(如示例中的DTO字段修改)

日志记录:在流水线中插入日志点

选择peek()而非map()的原因是:

无返回值需求:只需要修改对象状态,不需要转换对象类型

保持流结构:不改变流中元素引用,仅修改元素内部状态

操作简洁性:比map+对象拷贝更简洁(当只需部分字段修改时)

http://www.dtcms.com/a/573276.html

相关文章:

  • 大型购物网站建设方案wordpress登录页面模板下载
  • CSS 选择器详解
  • MySQL的DATE_ADD函数详解
  • 请求头是什么
  • 【EMNLP2025】阿里云人工智能平台PAI多篇论文入选EMNLP2025
  • 南宁网站推广工具wordpress动图
  • 这么建设一个网站钦州市建设局网站
  • SmartX 联合万博智云发布云原生异构容灾解决方案白皮书(附下载)
  • win11系统下载?【图文详解】win11系统微软官方下载?win11系统下载安装?
  • ESP32 LCD背光PWM控制全解析
  • Linux文件系统-从“物理盘片”到“逻辑结构”:文件系统如何为硬盘注入灵魂?
  • 硬件 - CadenceAllegro入门使用常见问题
  • 2025 实战指南:WebAssembly 重塑云原生开发 —— 从前端加速到后端革命的全栈落地
  • 商务网站开发建设工程合同分类有哪些
  • 【XR技术介绍】空间音频(Spatial Audio):原理是什么?如何让声音听起来像是从你身后传来的?
  • 海思 SLE 芯片 Linux 烧录
  • 《C++ STL哈希容器全解析:哈希拓展位图以及布隆过滤等高阶应用》
  • IOC 注解方式详解
  • LangFlow源码深度解析:Agent核心机制与工具化设计
  • gomobile build 成apk 遇到的几个问题
  • 化妆品购物网站开发的意义广州网络公司网络推广
  • 稳定的网站服务器租用七牛云存储 wordpress插件
  • 【SAA】SpringAI Alibaba学习笔记(一):SSE与WS的区别以及如何注入多个AI模型
  • 基于企业级建模平台Enterprise Architect的云地融合架构设计
  • 乡镇网站建设内容规划乐山网站制作设计公司
  • 【笔记】解决 “AssertionError: Torch not compiled with CUDA enabled“ 错误
  • 八股训练营第 7 天 | TCP连接如何确保可靠性?拥塞控制是怎么实现的?TCP流量控制是怎么实现的?UDP怎么实现可靠传输?
  • 清除BSS段(ZI段)
  • 数据库安全配置指导
  • 江苏南京建设局官方网站wordpress开发门户网站