>,java,java-8,java-stream,grouping"/>

首页 > 解决方案 > Java-8 流:转换 List<{String,List}> 到地图>

问题描述

我有一个包含项目列表的标记类

class Tag {

private String tagName
private List<String> items

}

我有一个标签列表,其中每个标签都是一个项目列表

List<Tag> tagList =   [
                       {"tagName": "popular", "items": ["Item1","Item2","Item3","Item4"]},
                       {"tagName": "expensive" , "items":  ["Item2","Item4","Item5"]},
                       {"tagName": "mostwanted", "items":  ["Item1","Item2","Item5"]}
                      ]

我想把它转换成一个地图,其中项目作为键,标签名作为值。

预期输出:

{
    "Item1" : ["popular","mostwanted"],
    "Item2" : ["popular","expensive","mostwanted"],
    "Item3" : ["popular","mostwanted"],
    "Item4" : ["popular","expensive"],
    "Item5" : ["expensive","mostwanted"]
}

我尝试了流/faltmap/groupingBy 的各种组合,但没有得到预期的输出。你能帮忙吗?谢谢

标签: javajava-8java-streamgrouping

解决方案


您可以将itemsusing变平,flatMap然后创建对itemtagNameusing SimpleEntryitem然后通过使用groupingBy和映射分组tagName以获取列表tagName

Map<String, List<String>> tagMap = tagList.stream()
        .flatMap(t -> t.getItems()
                       .stream()
                       .map(item -> new AbstractMap.SimpleEntry<>(item, t.getTagName())))
        .collect(Collectors.groupingBy(m -> m.getKey(),
            Collectors.mapping(m -> m.getValue(), Collectors.toList())));

推荐阅读