在地图的地图上过滤
Filter on map of map
我有下面的地图,想根据一个值过滤它。结果应分配回同一张地图。请告知最好的方法是什么。
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()));
如果您想就地修改地图(并且它允许这样做),您可以使用 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))));
我有下面的地图,想根据一个值过滤它。结果应分配回同一张地图。请告知最好的方法是什么。
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()));
如果您想就地修改地图(并且它允许这样做),您可以使用 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))));