收集列表<;对象>;映射<;字符串,列表<;对象>&燃气轮机;在Java8中使用流
我尝试使用Java8流而不是传统的for循环来完成这个迭代 我有一个对象列表收集列表<;对象>;映射<;字符串,列表<;对象>&燃气轮机;在Java8中使用流,java,java-8,Java,Java 8,我尝试使用Java8流而不是传统的for循环来完成这个迭代 我有一个对象列表List 而义务中有字符串的列表 义务包含如下字段 String类型的f1和f2 及 f3类型的列表 我想要实现的是Map这样,Map键中使用的String是列表中每个义务中的每个值 这就是代码在传统for循环中的外观: // newly initialized Map Map<String, List<Obligation>> map = new LinkedHashMap<String,
List
而义务
中有字符串
的列表
义务
包含如下字段
String
类型的f1
和f2
及
f3
类型的列表
我想要实现的是Map
这样,Map
键中使用的String
是列表中每个义务中的每个值
这就是代码在传统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);
}
}
}
//新初始化的映射
Map Map=newlinkedhashmap();
//假设列表已填充
列出义务=someMethod();
(义务:义务){
for(字符串许可证:义务.getLicenseId()){
if(地图容器(许可证)){
映射。获取(许可证)。添加(义务);
}否则{
列表=新的ArrayList();
增加(义务);
地图放置(许可证、列表);
}
}
}
使用flatMap
创建一组义务
和许可证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())));
地图=
义务。stream()//流
.flatMap(o->o.getLicenseId()
.stream()
.map(id->newsimplentry(o,id))//流
.collect(收集器.groupingBy(Map.Entry::getValue、,
Collectors.mapping(Map.Entry::getKey,
收藏家;
问题解释得很好,这里的新手付出了很大的努力。