当前位置: 首页 > 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.dtcms.com/a/295219.html

相关文章:

  • OpenMed 项目深度分析:推动医疗 NLP 领域的开源革命
  • pcie常用的查看寄存器方法
  • node.js中的path模块
  • 低速信号设计之 QSPI 篇
  • 【LeetCode数据结构】二叉树的应用(一)——单值二叉树问题、相同的树问题、对称二叉树问题、另一棵树的子树问题详解
  • Faiss中L2欧式距离与余弦相似度:究竟该如何选择?
  • Web前端入门:JavaScript 哪些地方需要 try...catch 异常捕获
  • 【图论】倍增与lca
  • Avalonia 基于MVVM的时间统计/系统时间显示 示例
  • EPSON爱普生全系列废墨垫已满清零工具分享附教程下载
  • EasyExcel 模板导出数据 + 自定义策略(合并单元格)
  • 基于深度学习的胸部 X 光图像肺炎分类系统(三)
  • Turbo Intruder 并发插件无法试用--更换新版Burpsuit解决(简单解决安装、破解问题)
  • 开源Qwen凌晨暴击闭源Claude!刷新AI编程SOTA,支持1M上下文
  • 跨境支付入门~国际支付结算(结算篇)
  • AtCoder Beginner Contest 415(ABCDE)
  • `neutron router-gateway-set` 操作失败的可能原因及解决方案
  • 深度分析Java多线程机制
  • 【智能协同云图库】智能协同云图库第六弹:空间模块开发
  • 微服务的编程测评系统6-管理员登录前端-前端路由优化
  • 【开源】WPF的数据可视化大屏解决方案——WpfMap
  • 洛谷 P11378 [GESP202412 七级] 燃烧-普及/提高-
  • fdbus4.2 timer的使用
  • AI时代,我的编程工作搭子
  • ospf单区域实验
  • Windows批量工具,直接起飞!
  • 外部存档(External Archive)机制
  • MNIST 手写数字识别模型分析
  • 无人机电池通讯接口应用:CANFD工业级芯片的选型与技术要点
  • 跨境支付入门~国际支付结算(稳定币)