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.
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? ' –
@RobertBain list.stream(). Collect (groupingBy ((Pojo p) -> p.getCategory(). GetMajorCategory(), groupingBy ((Pojo p) -> p.getCategory(). getMinorCategory()))); – Ruben
Qual è la differenza tra tutte le risposte ..? –