Java8 Stream 合并集合、分组、重复数据标记和职位处理
假设有以下两个对象的集合:
List<PartyMember> partyMembers = new ArrayList<>();
List<PartyOfficial> partyOfficials = new ArrayList<>();
可以先将两个集合合并成一个新的集合:
List<VillagePartyOrgVO> villagePartyOrgVOs = Stream.concat(
partyMembers.stream().map(member -> new VillagePartyOrgVO(member.getName(), member.getIdCard(), member.getMemCode(), member.getPosition(), 'member')),
partyOfficials.stream().map(official -> new VillagePartyOrgVO(official.getName(), official.getIdCard(), official.getMemCode(), official.getPosition(), 'official')))
.collect(Collectors.toList());
然后根据 memCode 或者 姓名和身份证进行分组:
Map<Object, List<VillagePartyOrgVO>> groups = villagePartyOrgVOs.stream()
.collect(Collectors.groupingBy(vo -> vo.getMemCode() != null ? vo.getMemCode() : Arrays.asList(vo.getName(), vo.getIdCard())));
接下来遍历每个分组,并对 type 不同但是重复的数据进行标记:
List<VillagePartyOrgVO> result = groups.values().stream()
.map(group -> {
Map<String, List<VillagePartyOrgVO>> typeGroups = group.stream()
.collect(Collectors.groupingBy(VillagePartyOrgVO::getType));
List<VillagePartyOrgVO> memberList = typeGroups.get('member');
List<VillagePartyOrgVO> officialList = typeGroups.get('official');
if (memberList != null && officialList != null) {
List<VillagePartyOrgVO> duplicates = memberList.stream()
.filter(member -> officialList.stream().anyMatch(official -> official.getName().equals(member.getName()) && official.getIdCard().equals(member.getIdCard())))
.map(VillagePartyOrgVO::markDuplicate)
.collect(Collectors.toList());
memberList.removeAll(duplicates);
officialList.removeAll(duplicates);
duplicates.forEach(duplicate -> {
duplicate.setPositions(Arrays.asList(duplicate.getPosition(), officialList.stream().filter(official -> official.getName().equals(duplicate.getName()) && official.getIdCard().equals(duplicate.getIdCard())).findFirst().get().getPosition()));
});
return Stream.concat(memberList.stream(), officialList.stream()).collect(Collectors.toList());
} else {
return group;
}
})
.flatMap(List::stream)
.collect(Collectors.toList());
最后将结果转成 Page 对象:
Page<VillagePartyOrgVO> page = new PageImpl<>(result, pageable, result.size());
原文地址: https://www.cveoy.top/t/topic/nuAF 著作权归作者所有。请勿转载和采集!