2015-11-24 36 views
8

Próbuję dowiedzieć się, jak mogę to napisać, aby użyć strumieni i filtrów, aby zawęzić moje kryteria i usunąć je z mapy, jeśli to konieczne.Strumienie Java 8 - Iterator Map and Remove na podstawie warunków

Iterator<Map.Entry<String,Object>> iter = listOfPossibleParams.entrySet().iterator(); 
while (iter.hasNext()) { 
    Map.Entry<String,Object> entry = iter.next(); 
    if(entry.getValue() instanceof String) { 
     if (StringUtils.isBlank((String) entry.getValue())) { 
      iter.remove(); 
     } 
    } 
} 

byłem początkowo myśli coś takiego, ale to obiviously robi praca jako błędy składni:

listOfPossibleParams.entrySet() 
      .stream() 
      .filter(p -> p.getValue() instanceof String) 
      .removeIf(e -> StringUtils.isBlank((String)e.getValue())); 
+0

Pokaż nam swoje błędy. – VDanyliuk

Odpowiedz

12

Jeśli można zmodyfikować mapie w miejscu, to można zrobić:

listOfPossibleParams.values() 
        .removeIf(v -> v instanceof String && StringUtils.isBlank((String) v)); 

Jeśli chcesz zamiast tego utworzyć nową mapę, możesz mieć:

listOfPossibleParams.entrySet() 
        .stream() 
        .filter(p -> { 
         Object v = p.getValue(); 
         return !(v instanceof String) || !StringUtils.isBlank((String) v); 
        }) 
        .collect(toMap(Map.Entry::getKey, Map.Entry::getValue)); 
+1

To chyba załatwiło sprawę @Tunaki - dzięki! Myślałem, że musiałbym filtrować go, zanim będę mógł użyć predykatu usuwania. Wydaje się, że pracujesz, przechodząc testy jednostkowe. –

+2

@Bitzal Robisz TDD, fajnie :) – Tunaki