Java 8 Stream 合并集合并分组:根据 MemCode、姓名和身份证进行分组,处理重复数据
假设现有两个集合:List
List<VillagePartyOrgVO> villagePartyOrgs = Stream.concat(members.stream().map(member -> {
VillagePartyOrgVO villagePartyOrg = new VillagePartyOrgVO();
villagePartyOrg.setName(member.getName());
villagePartyOrg.setIdCard(member.getIdCard());
villagePartyOrg.setMemCode(member.getMemCode());
villagePartyOrg.setPosition(member.getPosition());
villagePartyOrg.setType('member');
return villagePartyOrg;
}), parties.stream().map(party -> {
VillagePartyOrgVO villagePartyOrg = new VillagePartyOrgVO();
villagePartyOrg.setName(party.getName());
villagePartyOrg.setIdCard(party.getIdCard());
villagePartyOrg.setPosition(party.getPosition());
villagePartyOrg.setType('party');
return villagePartyOrg;
})).collect(Collectors.toList());
Map<String, List<VillagePartyOrgVO>> groupedVillagePartyOrgs = villagePartyOrgs.stream().collect(Collectors.groupingBy(villagePartyOrg -> {
if (StringUtils.isNotBlank(villagePartyOrg.getMemCode())) {
return villagePartyOrg.getMemCode();
} else {
return villagePartyOrg.getName() + villagePartyOrg.getIdCard();
}
}));
List<VillagePartyOrgVO> result = new ArrayList<>();
for (List<VillagePartyOrgVO> villagePartyOrgList : groupedVillagePartyOrgs.values()) {
Map<String, List<VillagePartyOrgVO>> typeGroupedVillagePartyOrgs = villagePartyOrgList.stream().collect(Collectors.groupingBy(VillagePartyOrgVO::getType));
if (typeGroupedVillagePartyOrgs.size() == 1) {
result.addAll(villagePartyOrgList);
} else {
Map<String, List<VillagePartyOrgVO>> positionGroupedVillagePartyOrgs = new LinkedHashMap<>();
for (VillagePartyOrgVO villagePartyOrg : villagePartyOrgList) {
List<VillagePartyOrgVO> sameTypeVillagePartyOrgs = typeGroupedVillagePartyOrgs.get(villagePartyOrg.getType());
if (sameTypeVillagePartyOrgs.size() > 1) {
String position = villagePartyOrg.getPosition();
List<VillagePartyOrgVO> positionGroupedVillagePartyOrgList = positionGroupedVillagePartyOrgs.computeIfAbsent(position, k -> new ArrayList<>());
positionGroupedVillagePartyOrgList.add(villagePartyOrg);
} else {
result.add(villagePartyOrg);
}
}
for (List<VillagePartyOrgVO> positionGroupedVillagePartyOrgList : positionGroupedVillagePartyOrgs.values()) {
VillagePartyOrgVO firstVillagePartyOrg = positionGroupedVillagePartyOrgList.get(0);
List<String> positions = positionGroupedVillagePartyOrgList.stream().map(VillagePartyOrgVO::getPosition).collect(Collectors.toList());
firstVillagePartyOrg.setPosition(positions);
result.add(firstVillagePartyOrg);
for (int i = 1; i < positionGroupedVillagePartyOrgList.size(); i++) {
VillagePartyOrgVO villagePartyOrg = positionGroupedVillagePartyOrgList.get(i);
villagePartyOrg.setPosition(positions);
result.add(villagePartyOrg);
}
}
}
}
Page<VillagePartyOrgVO> page = new PageImpl<>(result, pageable, result.size());
- 合并两个集合: 使用
Stream.concat()合并members和parties集合,并将每个对象转换为VillagePartyOrgVO对象。 - 根据条件分组: 使用
Collectors.groupingBy()将villagePartyOrgs集合根据memCode或name和idCard进行分组。 - 处理重复数据: 对于同一个分组内出现不同
type的数据,将相同职位的重复数据合并为列表,并将列表作为position属性的值。 - 结果转为 Page 对象: 使用
PageImpl将最终结果转换为分页对象。
代码示例演示了如何使用 Java 8 Stream 进行集合合并、分组和处理重复数据,并最终将其转换为分页对象。该代码可以帮助开发者更好地理解 Java 8 Stream 的应用,并提高代码的可读性和可维护性。
原文地址: https://www.cveoy.top/t/topic/nuz8 著作权归作者所有。请勿转载和采集!