Java 8 lambdas按多个字段分组

Rob*_*ain 6 java java-8 java-stream collectors

我有一个pojos列表,我想要执行一些分组.就像是:

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

public class Category {
    private final String majorCategory;
    private final String minorCategory;
}
Run Code Online (Sandbox Code Playgroud)

我想Map<String, Map<String, List<Pojo>>>,其中的关键是majorCategory和值是Map与关键minorCategory和值是ListPojo的对象表示minorCategory.

我打算用Java 8 lambdas来实现这一点.我可以通过以下方式完成第一级分组:

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

我怎么能再次分组minorCategory并获得Map<String, Map<String, List<Pojo>>>我的愿望?

更新

提供的第一个答案对于最初提供的示例是正确的,但是我已经更新了问题.鲁本在接受的答案中的评论提供了最后一块拼图.

Lou*_*man 14

groupingBy(Pojo::getMajorCategory, groupingBy(Pojo::getMinorCategory))
Run Code Online (Sandbox Code Playgroud)

应该工作,我想?

  • @RobertBain list.stream().collect(groupingBy((Pojo p) -&gt; p.getCategory().getMajorCategory(), groupingBy((Pojo p) -&gt; p.getCategory().getMinorCategory()))); (5认同)