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.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 ) |