2016-07-26 7 views
0

Also hier ist mein Code:Wenn ich Collectors.toMap in Java verwende, wie überspringe ich das Hinzufügen eines Eintrags zur neuen Map?

HashMap<String, List<Foo.Builder>> strFooMap = new HashMap<>(); 
// add stuff to strFooMap and do other things 
return new HashMap<>(strFooMap.entrySet() 
    .stream() 
    .collect(Collectors.toMap(Entry::getKey, 
     entry -> entry 
      .getValue() 
      .stream() 
      .filter(builder -> { 
       // do some conditional stuff to filter 
      }) 
      .map(builder -> { 
       return builder.build(); 
      }) 
      .collect(Collectors.toList()) 
     ) 
    ) 
); 

Also manchmal, nachdem die filter tun, dass alle Einzelteile in meinem List<Foo.Builder> werden gefiltert wird. Dann in meinem letzten HashMap, habe ich einen Eintrag wie folgt: {"someStr" -> []}. Ich möchte die Schlüsselwertpaare entfernen, bei denen der Wert eine leere Liste ist. Wie würde ich das machen? Wäre es möglich, dies im Code .stream().collect(Collectors.toMap(...)) zu tun? Vielen Dank!

+2

Bitte fügen Sie weitere Informationen, wie 'Foo.Builder' Methoden, und Ihre Rückgabetyp. Warum kopieren Sie die zurückgegebene Karte in eine andere HashMap? – shmosel

+2

Sie würden es vor dem Sammeln "filtern"? – Tunaki

Antwort

2

Eine der Lösungen wäre, die Wertumwandlung zu verschieben, bevor die zu kartierenden Ergebnisse gesammelt werden. Es gibt Ihnen die Möglichkeit, leere Werte herauszufiltern

List<Foo> transformValue(List<Foo.Builder> value) { 
    //original value transformation logic 
} 

<K,V> Entry<K,V> pair(K key, V value){ 
    return new AbstractMap.SimpleEntry<>(key, value); 
} 

strFooMap.entrySet().stream() 
     .map(entry -> pair(entry.getKey(), transformValue(entry.getValue())) 
     .filter(entry -> !entry.getValue().isEmpty()) 
     .collect(toMap(Entry::getKey, Entry::getValue)); 
+0

Ich bin ziemlich neu in Java (vor allem Lambda), könnten Sie kurz erklären, was der mittlere Teil bedeutet? Ist das eine generische Klasse mit Schlüssel, Wert als Rückgabe? –

+2

'pair' ist eine Hilfsfunktion zum Erstellen eines Map.Entry Objekts. Da Entry generisch ist, habe ich diese Funktion auch generisch erstellt. Weitere Informationen zu Generika finden Sie in der Dokumentation https://docs.oracle.com/javase/tutorial/java/generics/types.html –