假设现有两个集合:List members 和 List parties。

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());
  1. 合并两个集合: 使用 Stream.concat() 合并 membersparties 集合,并将每个对象转换为 VillagePartyOrgVO 对象。
  2. 根据条件分组: 使用 Collectors.groupingBy()villagePartyOrgs 集合根据 memCodenameidCard 进行分组。
  3. 处理重复数据: 对于同一个分组内出现不同 type 的数据,将相同职位的重复数据合并为列表,并将列表作为 position 属性的值。
  4. 结果转为 Page 对象: 使用 PageImpl 将最终结果转换为分页对象。

代码示例演示了如何使用 Java 8 Stream 进行集合合并、分组和处理重复数据,并最终将其转换为分页对象。该代码可以帮助开发者更好地理解 Java 8 Stream 的应用,并提高代码的可读性和可维护性。

Java 8 Stream 合并集合并分组:根据 MemCode、姓名和身份证进行分组,处理重复数据

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

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