2015-06-12 14 views
6

Mam listę pojos, które chcę wykonać niektóre grupy na. Coś jak:Java 8 grupowanie lambd przez wiele pól

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

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

chcę Map<String, Map<String, List<Pojo>>> gdzie kluczem jest majorCategory a wartość jest Map z klucza minorCategory i wartości to List z Pojo obiektów dla powiedział minorCategory.

Zamierzam użyć Javy 8 lambdas, aby to osiągnąć. Mogę dostać pierwszy poziom grupowania zrobić z następujących powodów:

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

Jak mogę teraz grupa ponownie minorCategory i uzyskać Map<String, Map<String, List<Pojo>>> pragnę?

Aktualizacja

Pierwsza odpowiedź jest prawidłowy dla przykładu przewidzianego początkowo, jednak ja od zaktualizowane pytanie. Komentarz Rubena w zaakceptowanej odpowiedzi stanowi ostatni element układanki.

Odpowiedz

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

powinien działać, tak myślę?

+1

Dziękuję za to, działa to na przykład w moim pytaniu, ale mogę mieć uproszczone. Właściwie grupuję się na polu na obiekcie zawartym w mojej pojo, nazwanej, powiedzmy, kategorii. Próbowałem '.collect (groupingBy (p -> p.getCategory(). GetMajorCategory(), groupingBy (p -> p.getCategory(). GetMinorCategory())))' ale nie przecina musztardy. Czy masz jakieś pomysły? ' –

+5

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

+0

Jaka jest różnica między wszystkimi odpowiedziami ...? –