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
相关产品推荐
相关产品推荐

