Java8 Stream 合并集合并分组处理重复数据 - 详细步骤与示例

假设有两个不同对象的集合,需要合并成一个新的 VillagePartyOrgVO 集合,并在合并后进行以下操作:

  1. 根据 memCode姓名身份证号 进行分组。
  2. 对重复数据进行标记,并将重复数据的职位拼接成逗号分隔的字符串。
  3. 根据时间进行排序。
  4. 将最终结果转换为 Page 对象。

VillagePartyOrgVO 对象包含以下属性:

  • memCode:成员代码
  • name:姓名
  • idCard:身份证号
  • position:职位
  • time:时间
  • type:类型

下面将详细介绍使用 Java8 Stream 实现上述操作的步骤:

1. 分组

首先需要根据 memCode姓名身份证号 进行分组,可以使用 groupingBy 方法来实现:

Map<String, List<VillagePartyOrgVO>> groupMap = list.stream()
    .collect(Collectors.groupingBy(vo -> StringUtils.isNotBlank(vo.getMemCode()) ? vo.getMemCode() : vo.getName() + vo.getIdCard()));

2. 处理重复数据

接着需要对重复数据进行标记,并把职位拼接成逗号分隔的字符串。可以使用 toMap 方法来实现:

List<VillagePartyOrgVO> resultList = groupMap.values().stream()
    .map(subList -> {
        if (subList.size() == 1) {
            return subList.get(0);
        } else {
            VillagePartyOrgVO first = subList.get(0);
            String positions = subList.stream().map(VillagePartyOrgVO::getPosition).collect(Collectors.joining(","));
            first.setPosition(positions);
            first.setType('重复');
            return first;
        }
    })
    .sorted(Comparator.comparing(VillagePartyOrgVO::getTime))
    .collect(Collectors.toList());

3. 转换为 Page 对象

最后需要把结果 list 转成 page 对象,可以使用 subList 方法来实现:

int pageSize = 10;
int total = resultList.size();
int pageCount = (int) Math.ceil((double) total / pageSize);
int pageNum = 1;
List<VillagePartyOrgVO> pageList = resultList.subList((pageNum - 1) * pageSize, Math.min(pageNum * pageSize, total));
Page<VillagePartyOrgVO> page = new PageImpl<>(pageList, PageRequest.of(pageNum - 1, pageSize), total);

总结

以上代码展示了如何使用 Java8 Stream 合并两个不同对象的集合,并根据条件进行分组,处理重复数据,最终将结果转换为分页对象。在实际应用中,可以根据具体的需求对代码进行修改和调整。

Java8 Stream 合并集合并分组处理重复数据 - 详细步骤与示例

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

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