> 技术文档 > Java集合去重

Java集合去重


方式一:TreeSet + Comparator

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

List 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 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());

 

 

✅ 这一段确实返回的是一个 MappartyAId 作为 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 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 seen = new HashSet();List 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