【问题标题】:Merge two List value maps合并两个 List 值映射
【发布时间】:2016-06-08 22:25:46
【问题描述】:

有人知道如何用 Java 8 合并这种类型的两个映射吗?

Map<String,  List<String>> map1--->["a",{1,2,3}]
Map<String,  List<String>> map2--->["a",{4,5,6}]

并作为合并的结果获得

Map<String,  List<String>> map3--->["a",{1,2,3,4,5,6}]

如果存在,我正在寻找一种非冗长的方式。我知道如何以老式方式进行操作。

问候。

【问题讨论】:

  • 是list的map,不一样。我以前看过那些帖子
  • 在我的情况下更加复杂,因为地图是在迭代器中创建的,所以我需要在每次迭代中将最后创建的地图与新地图合并。谢谢,但仍然看不到在我的示例中如何工作。也许你能提供一个例子吗?我真的没见过。谢谢!!!
  • 如果你正在使用 Guava,并且有ListMultimaps,那么这只是putAll

标签: java java-8 java-stream


【解决方案1】:

大体思路与this post中的相同。感谢merge(key, value, remappingFunction),您可以从第一个映射创建一个新映射,遍历第二个映射并将每个键与第一个映射合并。在冲突的情况下,应用重新映射功能:在这种情况下,它获取两个列表并将它们合并;如果没有冲突,则放入具有给定键和值的条目。

Map<String, List<String>> mx = new HashMap<>(map1);
map2.forEach((k, v) -> mx.merge(k, v, (l1, l2) -> {
    List<String> l = new ArrayList<>(l1);
    l.addAll(l2);
    return l;
}));

【讨论】:

  • 是我发现的不那么冗长的代码,所以我会接受它! ;) 谢谢!
  • 另一种合并函数是(l1, l2) -&gt; Stream.concat(l1.stream(),l2.stream()).collect(toList())。这是迄今为止最简单的 Java(没有 3rd 方库)。
  • 这减少了合并功能的冗长,谢谢!!
  • @paul 它确实减少了冗长但有点复杂(因为它创建了流管道)。
  • 速度对我来说比复杂性更重要。我想这是不那么冗长但更昂贵的事实
【解决方案2】:

你可以试试这个,它会逐渐使结构变平,直到你有一个映射键与列表值的元组流:

Map<K,List<V>> result = Stream.of(map1,map2) // Stream<Map<K,List<V>>>
    .flatMap(m -> m.entrySet().stream()) // Stream<Map.Entry<K,List<V>>>
    .flatMap(e -> e.getValue().stream() // Inner Stream<V>...
            .map(v -> new AbstractMap.SimpleImmutableEntry<>(e.getKey(), v))) 
    // ...flatmapped into an outer Stream<Map.Entry<K,V>>>
    .collect(Collectors.groupingBy(e -> e.getKey(), Collectors.mapping(e -> e.getValue(), Collectors.toList())));

我猜,另一种选择是通过使用 Collectors.reducing() 作为 groupingBy 的第二个参数来避免列表的内部流式传输。但是,我会先考虑接受的答案

【讨论】:

    【解决方案3】:

    你必须使用 Set 而不是 List 并且可以这样做:

    Map<String, Set<String>> map1--->["a",{1,2,3}]
    Map<String, Set<String>> map2--->["a",{4,5,6}]
    
    map1.forEach((k, v) -> v.addAll(map2.get(k) == null : new HashSet<> ? map2.get(k)));
    

    【讨论】:

    • 除了假设可变集合并且不处理第二个映射中可能缺少键,我不明白为什么这需要Sets。 Lists 的情况完全相同。
    • 因为使用列表,你会有重复的值
    猜你喜欢
    • 2018-08-23
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    相关资源
    最近更新 更多