在地图上过滤

时间:2016-07-20 20:46:12

标签: java-8 java-stream collectors

我有下面的地图地图,想要根据值过滤它。结果应该分配回同一个地图。请告诉我们最好的方法是什么。

Map<String, Map<String, Employee>> employeeMap;

<
 dep1, <"empid11", employee11> <"empid12",employee12>
 dep2, <"empid21", employee21> <"empid22",employee22>
>

Filter: employee.getState="MI"

我尝试过如下,但我无法访问员工对象

currentMap = currentMap.entrySet().stream()
            **.filter(p->p.getValue().getState().equals("MI"))**                    
            .collect(Collectors.toMap(p -> p.getKey(),p->p.getValue()));

1 个答案:

答案 0 :(得分:2)

如果你想修改地图(并允许这样做),你可以使用forEach迭代地图的条目,然后使用removeIf为每个值内部映射删除满足谓词的员工:

employeeMap.forEach((k, v) -> v.values().removeIf(e -> e.getState().equals("MI")));

否则,您可以使用toMap收集器,其中映射值的函数负责通过迭代内部映射的条目集来删除相关员工:

Map<String, Map<String, Employee>> employeeMap =
    employeeMap.entrySet()
               .stream()
               .collect(toMap(Map.Entry::getKey,
                              e -> e.getValue().entrySet().stream().filter(emp -> !emp.getValue().getState().equals("MI")).collect(toMap(Map.Entry::getKey, Map.Entry::getValue))));