2015-06-12 5 views
6

Ich habe eine Liste von pojos, die ich einige Gruppierung durchführen möchte. Etwas wie:Java 8 lambdas Gruppierung von mehreren Feldern

public class Pojo { 
    private final Category category; 
    private final BigDecimal someValue; 
} 

public class Category { 
    private final String majorCategory; 
    private final String minorCategory; 
} 

möchte ich eine Map<String, Map<String, List<Pojo>>>, wo der Schlüssel majorCategory ist und der Wert ist ein Map mit Schlüssel minorCategory und Werte ist ein List von Pojo Objekte für die minorCategory.

Ich beabsichtige, Java 8 Lambdas zu verwenden, um dies zu erreichen. Ich kann mit dem Anschluss an die erste Ebene der Gruppierung getan:

Map<String, Pojo> result = list 
    .stream() 
    .collect(groupingBy(p -> p.getCategory().getMajorCategory())); 

Wie kann ich Gruppe nun wieder auf minorCategory und bekommen die Map<String, Map<String, List<Pojo>>> ich wünsche?

aktualisiert

Die erste Antwort zur Verfügung gestellt für das Beispiel zunächst seit aktualisiert, jedoch unter der Voraussetzung richtig ist ich die Frage habe. Rubens Kommentar in der angenommenen Antwort liefert das letzte Puzzleteil.

Antwort

13
groupingBy(Pojo::getMajorCategory, groupingBy(Pojo::getMinorCategory)) 

sollte funktionieren, denke ich?

+1

Danke dafür funktioniert das für das Beispiel in meiner Frage, aber ich habe vielleicht zu stark vereinfacht. Ich gruppiere tatsächlich auf einem Feld auf einem Objekt, das in meinem Pojo enthalten ist, genannt, sagen wir, Kategorie. Ich habe versucht '.collect (groupingBy (p -> p.getCategory(). GetMajorCategory(), groupingBy (p -> p.getCategory(). GetMinorCategory()))) aber es schneidet nicht den Senf. Hast du irgendwelche Ideen? –

+5

@RobertBain list.stream(). Sammeln (groupingBy ((Pojo p) -> p.getCategory(). GetMajorCategory(), groupingBy ((Pojo p) -> p.getCategory(). getMinorCategory()))); – Ruben

+0

Was ist der Unterschied zwischen allen Antworten ..? –