假设有以下两个对象的集合:

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());
Java8 Stream 合并集合、分组、重复数据标记和职位处理

原文地址: https://www.cveoy.top/t/topic/nuAF 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录