[英]Collect List<Object> to Map<String, List<Object>> in Java 8 using stream
我试图使用java 8流而不是传统的for循环进行此迭代。
我有一个对象List<Obligation>
,而Obligation
有一个String
List
。
Obligation
包含类似的字段
String
类型的f1
和f2
,
和
List<String>
类型的f3
我想要实现的是Map<String, List<Obligation>>
这样,在Map
键中使用的String
是List<String>
每个值,来自List<Obligation>
每个Obligation
这就是代码在传统for循环中的样子:
// newly initialized Map
Map<String, List<Obligation>> map = new LinkedHashMap<String, List<Obligation>>();
// assume the list is populated
List<Obligation> obligations = someMethod();
for(Obligation obligation : obligations) {
for(String license : obligation.getLicenseIDs()) {
if(map.containsKey(license)) {
map.get(license).add(obligation);
} else {
List<Obligation> list = new ArrayList<Obligation>();
list.add(obligation);
map.put(license, list);
}
}
}
使用flatMap
创建一组Obligation
和许可证ID,然后使用groupingBy
按许可证ID收集它们。
Map<String, List<Obligation>> map =
obligations.stream() // Stream<Obligation>
.flatMap(o -> o.getLicenseIDs()
.stream()
.map(id -> new SimpleEntry<>(o,id))) // Stream<Map.Entry<Obligation,String>>
.collect(Collectors.groupingBy(Map.Entry::getValue,
Collectors.mapping(Map.Entry::getKey,
Collectors.toList())));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.