Фильтр на карте карты

У меня есть карта карты ниже, и я хочу отфильтровать ее на основе значения. Результат должен быть назначен обратно на ту же карту. Пожалуйста, дайте знать, что является лучшим подходом для этого.

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()));

person skumar    schedule 20.07.2016    source источник


Ответы (1)


Если вы хотите изменить карту на месте (и она это позволяет), вы можете использовать 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))));
person Alexis C.    schedule 20.07.2016
comment
Спасибо. я попробую это - person skumar; 21.07.2016