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