2017-11-17 2 views
1

Ich habe eine Karte, muss auf jeden Wert des Eintrags arbeiten und die modifizierte Karte zurückgeben. Ich habe es geschafft zu arbeiten, aber die resultierende Karte enthält Einträge mit leeren Wert, und ich möchte diese Einträge entfernen, kann aber nicht mit Java 8 Stream-API.Java 8 Stream API Filter leerer Wert aus Karte

hier ist mein ursprünglicher Code:

Map<String, List<Test>> filtered = Maps.newHashMap(); 
for (String userId : userTests.keySet()) { 
    List<Test> tests = userTests.get(userId); 
    List<Test> filteredTests = filterByType(tests, supportedTypes); 

    if (!CollectionUtils.isEmpty(filteredTests)) { 
     filtered.put(userId, filteredTests); 
    } 
} 
return filtered; 

und hier ist mein Java 8 Stream API-Version:

userTests.entrySet().stream() 
     .forEach(entry -> entry.setValue(filterByType(entry.getValue(), supportedTypes))); 

userTests.entrySet().stream().filter(entry -> !entry.getValue().isEmpty()); 
     return userTests; 
  1. Wie kann ich Einträge mit leeren/null Wert von der Karte entfernen?
  2. gibt es bessere Möglichkeit, den Code in Stream-API zu schreiben, die ich bisher nicht sehen, es ist besser als mein ursprünglicher Code
+0

Wo ist die Definition der 'filterByType'? – Dimitri

Antwort

1

userTests.entrySet().stream().filter(entry -> !entry.getValue().isEmpty()); dies keine Auswirkung. filter ist keine Terminaloperation.

Sie benötigen den Strom Ergebnis in eine neue Karte zu sammeln:

HashMap<String, String> map = new HashMap<>(); 
map.put("s",""); 
map.put("not empty", "not empty"); 

Map<String, String> notEmtpy = map.entrySet().stream() 
    .filter(e -> !e.getValue().isEmpty()) 
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); 
2

Sie zu brauchen sammeln in eine neue Map (sagen wir)

z.B.

Wie es derzeit steht, geben Sie einfach einen Stream mit den Zwischen- (Filter-) Operationen zurück. Die Operation terminal führt dies aus und gibt Ihnen die gewünschte Sammlung.

0

Versuchen Sie, die Filter in-line Einfügen:

Methode
userTests.entrySet().stream().filter(entry -> !entry.getValue().isEmpty()) 
.forEach(entry -> entry.setValue(filterByType(entry.getValue(), supportedTypes)));