2016-07-20 12 views
1

Ich habe unter Karte der Karte und möchte sie basierend auf einem Wert zu filtern. Das Ergebnis sollte der gleichen Karte zugewiesen werden. Bitte lassen Sie uns wissen, was der beste Ansatz dafür ist.Filter auf Karte der Karte

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

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

Filter: employee.getState="MI" 

versuchte ich, wie unten, aber ich war es, die Mitarbeiter Zugriff auf Objekt nicht in der Lage

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

Antwort

2

Wenn Sie die Karte in Position ändern möchten (und das es erlaubt, so), können Sie forEach zu iterieren die Einträge der Karte, und dann für jeden Wert der inneren Karten verwenden removeIf, um die Mitarbeiter zu entfernen, die das Prädikat erfüllen:

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

Ansonsten, was Sie tun können, ist die toMap Sammler zu verwenden, wobei die Funktion die Werte abzubilden nimmt durch Iterieren über die Eintragssatz der inneren Karten, die betroffenen Mitarbeiter zu entfernen:

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

Dank. Ich werde das versuchen – skumar