You need to enable JavaScript to run this app. Java 8 如何过滤List中id与department相同的重复Emp对象
优惠活动
大模型
产品
解决方案
定价
更多

Java 8 如何过滤List中id与department相同的重复Emp对象

Java8 实现List过滤:删除id与department完全相同的所有记录

实现思路

  • 首先统计所有id + department组合的出现频率,只要该组合出现次数≥2,对应所有记录全部移除
  • 再遍历原列表过滤,仅保留对应组合出现次数为1的记录

代码实现

首先确认你的Emp类已正确实现getId()、getDepartment()两个getter方法,实现代码如下:

import java.util.AbstractMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

// 你的原有Emp类定义此处省略

public class EmpFilter {
    public static void main(String[] args) {
        // 假设data是你已拿到的原始Emp列表
        List<Emp> data = getOriginData();
        
        // 第一步:统计每个<id, department>组合的出现次数
        Map<Map.Entry<Integer, String>, Long> groupCount = data.stream()
                .collect(Collectors.groupingBy(
                        emp -> new AbstractMap.SimpleEntry<>(emp.getId(), emp.getDepartment()),
                        Collectors.counting()
                ));
        
        // 第二步:过滤得到最终结果
        List<Emp> result = data.stream()
                .filter(emp -> groupCount.get(new AbstractMap.SimpleEntry<>(emp.getId(), emp.getDepartment())) == 1)
                .collect(Collectors.toList());
    }
}

上述代码用AbstractMap.SimpleEntry作为分组key,避免字符串拼接可能出现的key冲突问题,兼容性更好。

简化写法(仅适用于业务中id和department无下划线的场景)

如果确认业务中id转字符串、department值都不会出现下划线_,也可以用字符串拼接作为key,写法更简洁:

// 统计次数
Map<String, Long> groupCount = data.stream()
        .collect(Collectors.groupingBy(
                emp -> emp.getId() + "_" + emp.getDepartment(),
                Collectors.counting()
        ));

// 过滤
List<Emp> result = data.stream()
        .filter(emp -> groupCount.get(emp.getId() + "_" + emp.getDepartment()) == 1)
        .collect(Collectors.toList());

内容的提问来源于stack exchange,提问作者reiley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 09:24:01