我有List<ServiceName> servicesNames
,ServiceName具有以下结构:
public class ServiceName {
private Map<String, String> names;
}
其中
names
是具有语言和名称的Hashmap-通常是几个值。我正在尝试获取
Map<String lang, List<String> names>>
-其中key是语言,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之后实际上是对所有值进行键分组...
最佳答案
您需要 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())));