✅ 方式一: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 ) |