Java 8filter基于Map属性的Map对象列表,用于删除一些重复项

有一个

List<Map> allPoints = new LinkedList(); 

每个映射都包含一个带有String值的"name"键; 需要创建一个

  List<Map> expectedPoints 

列表中有重复的名称; 对于这些,只想保留最后一个。

例如,如果列表有三个项目,并且第一个和第三个项目都具有值为“abc”的“name”,则结果列表应仅包含原始列表中的第二个和第三个项目。

一种方法是使用辅助地图:

 Map> map = new LinkedHashMap<>(allPoints.size(), 0.75f, true); allPoints.forEach(point -> map.put((String)point.get("name"), point)); List> expectedPoints = new ArrayList<>(map.values()); 

这是有效的,因为Map.put要么将新条目放入Map.put要么使用新条目覆盖现有条目的值,从而仅保留与名称关联的最后一个点。

我正在使用其重载的构造函数创建一个访问顺序的 LinkedHashMap 。 这是为了保持与allPoints列表中相同的顺序。

如果您对一个或多个键值对有约束并且灵活使用Set,请编写您自己的Comparator并在LinkedList上使用descendingIterator并写入TreeSet 。 见下面的代码:

  LinkedList> allPoints = new LinkedList<>(); Set> expectedPoints = new TreeSet<>((objectMap1, objectMap2) -> objectMap2.get("name").equals(objectMap1.get("name")) ? 0 : -1 ); allPoints.descendingIterator().forEachRemaining(expectedPoints::add);