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

Java集合去重

✅ 方式一:TreeSet + Comparator

最优雅的一种,适用于对象中某个字段唯一的去重(如 partyAId

List<PartyACompanyVO> result = contractDOS.stream().map(contract -> {PartyACompanyVO vo = new PartyACompanyVO();vo.setPartyAId(contract.getPartyAId());vo.setPartyA(contract.getPartyA());return vo;}).collect(Collectors.collectingAndThen(Collectors.toCollection(() ->new TreeSet<>(Comparator.comparing(PartyACompanyVO::getPartyAId))),ArrayList::new));

 ✅ 方式二:用 Map 去重(适合多字段判断)

以某字段为 keyMap,保留第一个值

List<PartyACompanyVO> result = contractDOS.stream().map(contract -> {PartyACompanyVO vo = new PartyACompanyVO();vo.setPartyAId(contract.getPartyAId());vo.setPartyA(contract.getPartyA());return vo;}).collect(Collectors.toMap(PartyACompanyVO::getPartyAId, // 唯一键字段Function.identity(),(existing, replacement) -> existing // 保留第一个)).values().stream().collect(Collectors.toList());

 

 

✅ 这一段确实返回的是一个 Map<String, PartyACompanyVO>partyAId 作为 key,对象本身作为 value,并且会对重复 key 进行处理(保留第一个或最后一个)。 

 

 

 

步骤操作目的
.collect(Collectors.toMap(...))生成 Map,自动去重(key 是 partyAId
.values()取出所有值(PartyACompanyVO 对象)
.stream()转换为流
.collect(Collectors.toList())变成最终的 List

 

  • Function.identity():返回对象本身。

  • .values().stream():从 Map 拿到去重后的对象,再转回 List。

 

✅ 方式三:用 distinct() + 重写 equals & hashCode

适合对象整体去重

首先你要重写 PartyACompanyVO

@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class PartyACompanyVO {@EqualsAndHashCode.Includeprivate String partyAId;private String partyA;
}
List<PartyACompanyVO> result = contractDOS.stream().map(contract -> {PartyACompanyVO vo = new PartyACompanyVO();vo.setPartyAId(contract.getPartyAId());vo.setPartyA(contract.getPartyA());return vo;}).distinct().collect(Collectors.toList());

✅ 方式四:使用临时 Set 去重(简单直接)

Set<String> seen = new HashSet<>();
List<PartyACompanyVO> result = contractDOS.stream().map(contract -> {PartyACompanyVO vo = new PartyACompanyVO();vo.setPartyAId(contract.getPartyAId());vo.setPartyA(contract.getPartyA());return vo;}).filter(vo -> seen.add(vo.getPartyAId())) // 如果添加失败说明已存在.collect(Collectors.toList());

总结

场景推荐方式
单字段去重,简洁优雅✅ 方式一(TreeSet + Comparator
需要 Map 结构或复杂合并逻辑✅ 方式二(Map 去重)
已有完整对象定义且支持 .equals()✅ 方式三(重写 equals + distinct()
简单过滤,临时处理✅ 方式四(手动 Set
http://www.lryc.cn/news/597984.html

相关文章:

  • 借助AI学习开源代码git0.7之九diff-files
  • VUE的学习
  • Linux驱动19 --- FFMPEG
  • kettle插件-kettle数据挖掘ARFF插件
  • Django 科普介绍:从入门到了解其核心魅力
  • 关闭 Chrome 浏览器后,自动删除浏览历史记录
  • 开源项目XBuilder前端框架
  • 从字符串替换到神经网络:AI发展历程中的关键跨越
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 主页-评论用户名词云图实现
  • 高版本Android跨应用广播通信实例
  • tensorflow搭建神经网络
  • 遨游三防平板|国产芯片鸿蒙系统单北斗三防平板,安全高效
  • Node.js特训专栏-实战进阶:18.密码加密与安全传输
  • AI赋能软件工程让测试左移更加可实施
  • 【机器学习之推荐算法】基于K最近邻的协同过滤推荐与基于回归模型的协同过滤推荐
  • LeetCode|Day24|383. 赎金信|Python刷题笔记
  • 微服务-springcloud-springboot-Skywalking详解(下载安装)
  • 用 Function Call 让 AI 主动调用函数(超入门级示例)|保姆级大模型应用开发实战
  • Linux 进程间通信:共享内存详解
  • Spring Boot 3整合Spring AI实战:9轮面试对话解析AI应用开发
  • 【OD机试】矩阵匹配
  • 【分布式锁】什么是分布式锁?分布式锁的作用?
  • redis前期工作:环境搭建-在ubuntu安装redis
  • 实验-OSPF
  • 开立医疗2026年校园招聘
  • 【论文|复现】YOLOFuse:面向多模态目标检测的双流融合框架
  • OSPF路由协议单区域
  • Selenium基础教程
  • 在Ubuntu上使用QEMU学习RISC-V程序(2)gdb调试
  • 【OpenCV篇】OpenCV——03day.图像预处理(2)