Java 8 如何使用Java8 Collectors groupingBy获取带有集合映射的映射?

Java 8 如何使用Java8 Collectors groupingBy获取带有集合映射的映射?,java-8,java-stream,collectors,Java 8,Java Stream,Collectors,想象一下这些课程 class Subject { private int id; private Type type; private String origin; private String name; Subject(int id, Type type, String origin, String name) { this.id = id; this.type = type; this.origin = origin;

想象一下这些课程

class Subject {
   private int id;
   private Type type;
   private String origin;
   private String name;

   Subject(int id, Type type, String origin, String name) {
      this.id = id;
      this.type = type;
      this.origin = origin;
      this.name = name;
   }

   // Getters and Setters
}

enum Type {
   TYPE1,
   TYPE2
}
我有一份这些科目的清单

List<Subject> subjects = Arrays.asList(
    new Subject(1, Type.TYPE1, "South", "Oscar"),
    new Subject(2, Type.TYPE2, "South", "Robert"),
    new Subject(3, Type.TYPE2, "North", "Dan"),
    new Subject(4, Type.TYPE2, "South", "Gary"));
List subjects=Arrays.asList(
新主题(1,Type.TYPE1,“南方”、“奥斯卡”),
新主题(2,Type.TYPE2,“南方”、“罗伯特”),
新主题(3,Type.TYPE2,“北”、“丹”),
新科目(4个,类型2,“南方”、“加里”);
我想获得使用
Collectors.groupingBy()
映射的结果,首先按
Subject.origin
Subject
对象进行分组,然后按
Subject.type


因此,获取这样的对象
Map
groupingBy
会接受一个下游收集器,它也可以是一个
groupingBy

subjects.stream()
        .collect(groupingBy(
                Subject::getOrigin, 
                groupingBy(Subject::getType)    
        ));
Stream subjects=Stream.of(
新主题(1,Subject.Type.TYPE1,“南方”、“奥斯卡”),
新主题(2,Subject.Type.TYPE2,“南方”,“罗伯特”),
新主题(3,Subject.Type.TYPE2,“北”、“丹”),
新科目(4,Subject.Type.TYPE2,“南方”、“加里”);
地图主题ByOriginByType;
subjectByOriginByType=subjects.collect(Collectors.groupingBy(
s->s.getOrigin(),Collectors.groupingBy(
s->s.getType(),
Collectors.mapping((Subject s)->s,Collectors.toList());

这帮助我解决了一个类似的问题:如果您希望进一步聚合叶列表,内部GroupBy还可以使用下游收集器。在我的例子中,我需要
.collect(groupingBy(DishIngredientMass::getDishId,groupingBy(DishIngredientMass::getingredientmass,summingDouble(DishIngredientMass::getCookMass))
Stream<Subject> subjects = Stream.of(
  new Subject(1, Subject.Type.TYPE1, "South", "Oscar"), 
  new Subject(2, Subject.Type.TYPE2, "South", "Robert"),
  new Subject(3, Subject.Type.TYPE2, "North", "Dan"), 
  new Subject(4, Subject.Type.TYPE2, "South", "Gary"));




Map<String, Map<Subject.Type, List<Subject>>>  subjectByOriginByType;
subjectByOriginByType = subjects.collect(Collectors.groupingBy(
        s->s.getOrigin(), Collectors.groupingBy(
        s->s.getType(), 
        Collectors.mapping((Subject s) -> s, Collectors.toList()))));