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 去重(适合多字段判断)

以某字段为 key 建 Map,保留第一个值

复制代码
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.Include
    private 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)
相关推荐
奋发向前wcx18 分钟前
CSP-J复赛模拟赛1 王晨旭补题 2026.10.2
java·开发语言
周杰伦fans25 分钟前
轻量模型高并发推理优化技巧
开发语言·人工智能·c#
Frank_refuel29 分钟前
【C++项目】手撕JRpc框架(单机怎么优化到分布式思想)
开发语言·c++
卓怡学长31 分钟前
w192基于springboot“考研情报站”微信小程序设计与实现
java·spring boot·spring·微信小程序·intellij-idea
wuminyu41 分钟前
JEP491中synchronized关键字引发的平台线程钉住解决方法简介
java·linux·c语言·jvm·c++
可乐鸡翅yeah_1 小时前
fmp4 碎片 MP4 格式 HLS 流,和传统 TS 分片有什么不一样
开发语言·javascript·ios·音视频·safari·m3u8·m3u8在线播放
流形填表1 小时前
多校区题库标准化:Excel模板与校验脚本
开发语言·python
步行cgn1 小时前
AOP 通知的类型详解
开发语言
weixin_307779131 小时前
从“人操作仪器”到“Agent 自主发现”:OPL 金属材料自驱动实验室 MVP 技术论述
开发语言·人工智能·算法·架构
笑鸿的学习笔记2 小时前
C++笔记之SIMD与SSE指令集
开发语言·c++·笔记