Java如何识别Vo列表重复记录 按指定字段拆分去重生成多列表
实现方案
1. 按validated字段拆分列表(Lambda简化实现)
使用Collectors.partitioningBy分区收集器,可一步完成两类数据的拆分,替代原有for循环:
// 按validated是否为1拆分,key为true对应已验证列表,false对应未验证列表 Map<Boolean, List<MyVo>> validatedPartition = dataList.stream() .collect(Collectors.partitioningBy(vo -> vo.getValidated() == 1)); List<MyVo> registeredBusinesses = validatedPartition.get(true); List<MyVo> unregisteredBusinesses = validatedPartition.get(false);
2. 拆分已验证列表为去重列表&重复项列表
你之前使用的状态型Predicate的作用是过滤重复key的后续元素、仅保留首次出现的元素,不符合「所有重复registered对应的全部条目都归入重复列表」的需求。我们可以先统计registered字段的出现频次,再按频次拆分即可:
// 第一步:统计每个registered的出现次数 Map<String, Long> registeredCount = registeredBusinesses.stream() .collect(Collectors.groupingBy(MyVo::getRegistered, Collectors.counting())); // 第二步:提取去重后的列表(仅保留registered只出现1次的条目) List<MyVo> distinctRegisteredBusinesses = registeredBusinesses.stream() .filter(vo -> registeredCount.get(vo.getRegistered()) == 1) .collect(Collectors.toList()); // 第三步:提取重复项列表(所有registered出现次数≥2的条目) List<MyVo> registeredDuplicateBusinesses = registeredBusinesses.stream() .filter(vo -> registeredCount.get(vo.getRegistered()) >= 2) .collect(Collectors.toList());
结果验证
执行上述代码后,三个列表和你期望的输出完全一致:
unregisteredBusinesses:仅包含validated为0的Orlando条目distinctRegisteredBusinesses:仅包含registered唯一的Jess条目registeredDuplicateBusinesses:包含registered为008982的Fernando、Magda两条条目
内容的提问来源于stack exchange,提问作者Sebastian Ruiz
相关产品推荐
相关产品推荐

