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

时间:2019-07-17 05:30:44

标签: java java-8

我正在尝试使用Java 8流而不是传统的for循环进行此迭代。

我有一个对象列表List<Obligation> 并且Obligation中的List中有String

Obligation包含

之类的字段

f1f2类型的String

f3类型的List<String>

我想要实现的是Map<String, List<Obligation>>,使得String的键中使用的MapList<String>中{ {1}}

这是代码在传统for循环中的外观:

Obligation

1 个答案:

答案 0 :(得分:4)

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