2015-06-12 11 views
6

Ho una lista di pojos su cui voglio eseguire qualche raggruppamento. Qualcosa di simile:Java 8 lambdas raggruppamento per più campi

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

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

Voglio un Map<String, Map<String, List<Pojo>>> in cui la chiave è majorCategory e il valore è un Map con chiave minorCategory e valori è un List di Pojo oggetti per detto minorCategory.

Ho intenzione di utilizzare Java 8 lambda per raggiungere questo obiettivo. Posso ottenere il primo livello di raggruppamento fatto con la seguente:

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

Come posso ora gruppo di nuovo sul minorCategory e ottenere il Map<String, Map<String, List<Pojo>>> che desidero?

Aggiornamento

La prima risposta fornita è corretta per l'esempio fornito inizialmente, però ho dato aggiornato la questione. Il commento di Ruben nella risposta accettata fornisce il pezzo finale del puzzle.

risposta

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

dovrebbe funzionare, credo?

+1

Grazie per questo, questo funziona per l'esempio nella mia domanda ma potrei aver semplificato eccessivamente. In realtà sto raggruppando su un campo su un oggetto contenuto nel mio pojo, chiamato, per esempio, categoria. Ho provato '.collect (groupingBy (p -> p.getCategory(). GetMajorCategory(), groupingBy (p -> p.getCategory(). GetMinorCategory())))' ma non taglia la senape. Avete idee? ' –

+5

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

+0

Qual è la differenza tra tutte le risposte ..? –