Java 按和映射值分组

Java 按和映射值分组,java,java-8,java-stream,Java,Java 8,Java Stream,我尝试按(映射)进行分组,然后将值列表转换为不同的列表 我有一份地区文件清单: List<DistrictDocument> docs = new ArrayList<>(); 有没有办法把这个方法放到我上面的流中,这样我就可以得到Map? 我尝试将第二个参数添加到groupingBy,但找不到合适的方法,并且总是出现编译错误 编辑: 如果我的createFizz返回列表,该怎么办?在Collectors.mapping中是否有平放此列表的选项,因为我仍然希望使用Map

我尝试按(映射)进行分组,然后将值列表转换为不同的列表

我有一份地区文件清单:

List<DistrictDocument> docs = new ArrayList<>();
有没有办法把这个方法放到我上面的流中,这样我就可以得到
Map
? 我尝试将第二个参数添加到groupingBy,但找不到合适的方法,并且总是出现编译错误

编辑:
如果我的createFizz返回
列表
,该怎么办?在Collectors.mapping中是否有平放此列表的选项,因为我仍然希望使用
Map
而不是
Map

您需要将
收集器.mapping()
收集器链接到
收集器。groupingBy()
收集器:

Map<String, List<Fizz>> collect =
    docs.stream()
        .collect(Collectors.groupingBy(DistrictDocument::getCity,
                 Collectors.mapping(d->createFizz(d),Collectors.toList())));
如果您不能使用Java 9,也许使用
Collectors.toMap
将有助于:

Map<String, List<Fizz>> collect =
    docs.stream()
        .collect(Collectors.toMap(DistrictDocument::getCity,
                                  d->createFizz(d),
                                  (l1,l2)->{l1.addAll(l2);return l1;}));
地图收集=
docs.stream()
.collect(Collectors.toMap(DistrictDocument::getCity、,
d->createFizz(d),
(l1,l2)->{l1.addAll(l2);返回l1;});

如果要进行双重嵌套分组:

假设您有一组
EducationData
对象,其中包含学校名、教师名和学生名。但您需要一个嵌套贴图,其外观如下:

你有什么 你想要什么
映射所需的mapofmpas。。。
//看起来是这样的:
“东高中”:{
“杰克逊女士”:[“德里克·谢泼德”、“梅雷迪斯·格雷”、…],
“特里萨先生”:[“埃莉诺·谢尔斯特罗”、“杰森·门多萨”、…],
....
}
怎么去那里
导入静态java.util.stream.collector.*;
公共双嵌套组(列出教育){
Map nestedMap=educations.stream()
.收集(
分组依据(
教育数据::getSchool,
分组依据(
EducationData::getTeacher,
映射(
教育数据::getStudent,
托利斯特()
)
)
)
);
}

d->createFizz(d)
您可以为此使用方法引用。无可否认,我们不知道这个类。@Michael是的,不知道这个类是我没有使用方法引用的主要原因。你能检查我的编辑吗?不幸的是,createFizz必须返回列表,我似乎找不到一种方法来整理这个列表。@doublemc我相信java 9有Collectors.flatMapping,所以您可以编写
Collectors.flatMapping(d->createFizz(d.stream(),Collectors.toList())
;如果我最多只能使用Java8怎么办?有办法吗?
Map<String, List<Fizz>> collect =
    docs.stream()
        .collect(Collectors.groupingBy(DistrictDocument::getCity,
                 Collectors.mapping(d->createFizz(d),Collectors.toList())));
Map<String, List<Fizz>> collect =
    docs.stream()
        .collect(Collectors.groupingBy(DistrictDocument::getCity,
                 Collectors.flatMapping(d->createFizz(d).stream(),Collectors.toList())));
Map<String, List<Fizz>> collect =
    docs.stream()
        .collect(Collectors.toMap(DistrictDocument::getCity,
                                  d->createFizz(d),
                                  (l1,l2)->{l1.addAll(l2);return l1;}));
class EducationData {
     String school;
     String teacher;
     String student;

     // getters setters ...
}
Map<String, Map<String, List<String>>> desiredMapOfMpas ...

// which would look like this :

"East High School" : {
     "Ms. Jackson" : ["Derek Shepherd", "Meredith Grey", ...],
     "Mr. Teresa" : ["Eleanor Shellstrop", "Jason Mendoza", ...],
     ....
}
import static java.util.stream.Collectors.*;

public doubleNestedGroup(List<EducationData> educations) {
     Map<String, Map<String, List<String>>> nestedMap = educations.stream()
        .collect(
             groupingBy(
                  EducationData::getSchool,
                  groupingBy(
                       EducationData::getTeacher,
                       mapping(
                            EducationData::getStudent,
                            toList()
                       )
                  )
              )
        );
}