首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将Map<String、List<List<String>>>转换为Map<String、List<String>>

如何将Map<String、List<List<String>>>转换为Map<String、List<String>>
EN

Stack Overflow用户
提问于 2022-02-09 10:13:47
回答 2查看 839关注 0票数 0
代码语言:javascript
运行
复制
 Map<String, List<String>> map1 = new HashMap<>();
  Map<String, List<String>> map2 = new HashMap<>();
   map1.put("a", Lists.newArrayList("1","123"));
    map1.put("b", Lists.newArrayList("2","223"));

    map2.put("c", Lists.newArrayList("11","1123"));
    map2.put("a", Lists.newArrayList("22","2223"));
  Map<String, List<List<String>>> collect = Stream.of(map1, map2)
            .flatMap(m -> m.entrySet().stream())
            .collect(Collectors.groupingBy(Map.Entry::getKey,
                    Collectors.mapping(Map.Entry::getValue,
                            Collectors.toList())
            ));
 System.out.println(collect);

打印:{a=[1,123,22,2223,1,123],b=[2,223],c=[11,1123]}

如何打印:{a=22,2223,1,123,b=2,223,c=11,1123}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-09 10:40:18

您可以使用一个简单的for循环并这样做。

代码语言:javascript
运行
复制
List<Map<String, List<String>>> source = Arrays.asList(map1, map2);
for (Map<String, List<String>> m : source) {
    for (Map.Entry<String, List<String>> e : m.entrySet()) {
        target.computeIfAbsent(e.getKey(), unused -> new ArrayList<>())
            .addAll(e.getValue());
    }
}

基于流的对应对象应该是这样的。

代码语言:javascript
运行
复制
Map<String, List<String>> res = source.stream()
    .flatMap(m -> m.entrySet().stream())
    .collect(Collectors.groupingBy(Map.Entry::getKey,
        Collectors.flatMapping(e -> e.getValue().stream(), Collectors.toList())));

Collectors.flatMapping可以从java9开始使用。如果您正在使用java8,我建议您为flatMapping编写自己的自定义收集器,并在这里使用它。这也将为Java9提供一个更容易的迁移策略。你可以找到一个解释here

票数 0
EN

Stack Overflow用户

发布于 2022-02-09 10:57:54

我一开始就不会创建List<List<String>>

代码语言:javascript
运行
复制
Map<String, List<String>> map1 = new HashMap<>();
Map<String, List<String>> map2 = new HashMap<>();
map1.put("a", Lists.newArrayList("1","123"));
map1.put("b", Lists.newArrayList("2","223"));

map2.put("c", Lists.newArrayList("11","1123"));
map2.put("a", Lists.newArrayList("22","2223"));

Map<String, List<String>> collect = Stream.of(map1, map2)
        .flatMap(m -> m.entrySet().stream())
        .collect(Collectors.groupingBy(Map.Entry::getKey,
                 Collectors.flatMapping(e -> e.getValue().stream(), Collectors.toList())));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71047692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档