2016-07-20 1 views
1

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

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

ответ

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)))); 
+0

Спасибо. я попробую это – skumar

Смежные вопросы