如何移除HashMap中List<A>内result字段重复的A对象
解决HashMap中List的Result去重问题
嘿,刚好能帮你搞定这个去重需求!你已经用removeIf过滤掉了result为null的元素,接下来要移除重复result的A对象,只保留其中一个,这里有两种实用的方案:
方案一:用HashSet跟踪已出现的Result(简洁高效)
这种方式直接在原List上操作,借助HashSet的add方法特性(添加已存在元素会返回false)来判断是否移除元素,一次遍历就能完成:
map.forEach((key, aList) -> { // 用来用来记录已经出现过的result值 Set<Object> seenResults = new HashSet<>(); // removeIf返回false时说明result已存在,移除当前元素 aList.removeIf(a -> !seenResults.add(a.getResult())); });
说明:
- 这个方法会保留第一个遇到的具有相同
result的A对象 - 如果
result是自定义类型,要确保该类正确实现了equals()和hashCode()方法,否则无法正确判断重复
方案二:用Collectors.toMap灵活选择保留元素
如果你需要灵活选择保留重复元素中的第一个或最后一个,可以用toMap收集器,再把结果转回List:
map.forEach((key, aList) -> { List<A> uniqueList = aList.stream() .collect(Collectors.toMap( A::getResult, // 以result作为去重的key Function.identity(), // 保留A对象本身 (existing, newOne) -> existing // 重复时保留已存在的(第一个) // 如果要保留最后一个,改成 (existing, newOne) -> newOne )) .values() // 提取去重后的A对象集合 .stream() .collect(Collectors.toList()); // 替换原List的内容 aList.clear(); aList.addAll(uniqueList); });
说明:
- 这种方式可以明确指定重复时保留哪一个元素,比第一种更灵活
- 最终得到的List顺序和原List中元素的出现顺序一致(Java 8+的
toMap在无指定排序时,会保留插入顺序)
你可以根据自己的需求选择合适的方案,两种都能完美解决你的去重问题~
内容的提问来源于stack exchange,提问作者Fofole
相关产品推荐
相关产品推荐

