收集列表<;对象>;映射<;字符串,列表<;对象>&燃气轮机;在Java8中使用流

收集列表<;对象>;映射<;字符串,列表<;对象>&燃气轮机;在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,

我尝试使用Java8流而不是传统的for循环来完成这个迭代

我有一个对象列表
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,
收藏家;

问题解释得很好,这里的新手付出了很大的努力。