You need to enable JavaScript to run this app. Java如何识别Vo列表重复记录 按指定字段拆分去重生成多列表
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 03:57:05