2015-11-24 11 views
8

Sto cercando di capire come posso riscrivere questo per utilizzare flussi e filtri per restringere i miei criteri e rimuoverli dalla mappa se necessario.Java 8 Stream - Iterator Map e Remove in base alle condizioni

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

Inizialmente ero pensando qualcosa di simile, ma il lavoro obiviously doesnt come errori di sintassi:

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

Mostraci i tuoi errori. – VDanyliuk

risposta

12

Se è possibile modificare la mappa in luogo, allora si potrebbe fare:

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

Se invece vuoi costruire una nuova mappa, puoi:

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

Sembrava fare il trucco @Tunaki - Grazie! Ho pensato di doverlo filtrare prima di poter usare il predicato di rimozione. Sembra che stia passando test unitari. –

+2

@Bitzal Stai facendo TDD, carino :) – Tunaki