使用flatmap进行流分组

时间:2018-03-08 15:05:54

标签: java java-8 java-stream

我有List<ServiceName> servicesNames,ServiceName具有以下结构:

public class ServiceName {
private Map<String, String> names;
}

其中names是具有语言和名称的Hashmap - 通常是多个值。

我试图获取Map<String lang, List<String> names>> - 其中key是language,value是来自List<ServiceName>的给定语言的所有名称的列表。

这是我到目前为止所得到的但是可以把它放在一起 - 得到编译错误:

servicesNames
    .stream()
    .map(x -> x.getNames())
    .flatMap(x -> x.entrySet().stream())
    .collect(x -> Collectors.groupingBy());

编辑: 我能够得到这个:

List<Map.Entry<String, String>> collect1 = servicesNames
    .stream()
    .map(x -> x.getNames())
    .flatMap(x -> x.entrySet().stream())
    .collect(Collectors.toList());

但是在使用flatmap后,不知道实际按键分组所有值...

1 个答案:

答案 0 :(得分:8)

您需要Collectors.groupingBy按键对值进行分组,并通过Collectors.mapping将映射应用于下游。

基于lambda的方法:

Map<String, List<String>> map = servicesNames
        .stream()
        .flatMap(service -> service.getNames().entrySet().stream())
        .collect(groupingBy(e -> e.getKey(), mapping(e -> e.getValue(), toList())));

基于方法参考的方法:

Map<String, List<String>> map = servicesNames
        .stream()
        .map(ServiceName::getNames)
        .map(Map::entrySet)
        .flatMap(Set::stream)
        .collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));