使用流在Java 8中将List<Object>收集到Map<String,List<Object>>中

4
我希望用Java 8 Stream而不是传统的for循环来进行这个迭代。我有一个对象列表 List<Obligation>,而 Obligation 中包含一个 List,其中还有多个 StringObligation 包含以下字段: f1f2String 类型, f3List<String> 类型
我想要实现的是一个 Map<String, List<Obligation>> ,使得每个值在 List<String> 中的 Obligation 都可以用作 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);
                        }
                    }
                }

问题解释得很清楚,新手做得很不错。 - Vishwa Ratna
1个回答

5
使用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())));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接