2014-03-26 4 views
7

Ich suche zum ersten Mal nach der Stream-API von Java 8. Und ich habe versucht, einen Filter zu erstellen, um Elemente aus einer Karte zu entfernen.Verwendung von Collectors.grouping in Java 8 Stream-API zum Erstellen einer Karte

Das ist meine Karte:

Map<String, Integer> m = new HashMap<>(); 

Ich mag Einträge mit < Wert entfernen = als 0, so dass ich einen Filter anwenden möchte, und wieder eine neue Karte (Map < String, Integer >). Diese

ist, was ich versucht worden:

m.entrySet().stream().filter(p -> p.getValue() > 0).collect(Collectors.groupingBy(s -> s.getKey()));  

Ich bekomme eine HashMap < String, Arraylist < HashMap $ Knoten > >. Also nicht, wonach ich gesucht habe.

ich auch versucht:

m.entrySet().stream().filter(p -> p.getValue() > 0).collect(Collectors.groupingBy(Map::Entry::getKey, Map::Entry::getValue)); 

Und dies verursacht:

// Error:(50, 132) java: method reference not expected here 

Im Grunde weiß ich nicht, wie die Werte meines neuen Map zu bauen.

Dies ist die javadoc of Collectors, sie schrieben ein paar Beispiele für groupyBy, aber ich konnte es nicht funktionieren.

Also, wie soll ich die sammeln schreiben, um meine Karte so zu bauen, wie ich will?

Antwort

11

Sie brauchen nicht die Stream Artikel wieder zu gruppieren, werden sie bereits "gemappt" - Sie müssen nur sie sammeln:

m.entrySet().stream() 
    .filter(p -> p.getValue() > 0) 
    .collect(toMap(Entry::getKey, Entry::getValue)); 

Importe:

import java.util.Map.Entry; 
import static java.util.stream.Collectors.toMap; 
Verwandte Themen