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

时间:2018-03-09 15:06:04

标签: java java-8

有一个

List<Map<String, Object>> allPoints = new LinkedList<>();

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

 List<Map<String, Object>> expectedPoints

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

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

2 个答案:

答案 0 :(得分:3)

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

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

List<Map<String, Object>> expectedPoints = new ArrayList<>(map.values());

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

我正在使用overloaded constructor创建访问顺序 LinkedHashMap。这是为了保持与allPoints列表中相同的顺序。

答案 1 :(得分:3)

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

        LinkedList<Map<String, Object>> allPoints = new LinkedList<>();

        Set<Map<String, Object>> expectedPoints = new TreeSet<>((objectMap1, objectMap2) ->
                objectMap2.get("name").equals(objectMap1.get("name")) ? 0 : -1
        );

        allPoints.descendingIterator().forEachRemaining(expectedPoints::add);