Java8 Stream 合并集合并分组处理重复数据 - 详细步骤与示例
Java8 Stream 合并集合并分组处理重复数据 - 详细步骤与示例
假设有两个不同对象的集合,需要合并成一个新的 VillagePartyOrgVO 集合,并在合并后进行以下操作:
- 根据
memCode或姓名和身份证号进行分组。 - 对重复数据进行标记,并将重复数据的职位拼接成逗号分隔的字符串。
- 根据时间进行排序。
- 将最终结果转换为
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 合并两个不同对象的集合,并根据条件进行分组,处理重复数据,最终将结果转换为分页对象。在实际应用中,可以根据具体的需求对代码进行修改和调整。
原文地址: https://www.cveoy.top/t/topic/nuN3 著作权归作者所有。请勿转载和采集!