使用流在Java 8中合并两个映射表

4

我有两个地图

Map<A, B> mapA
Map<B, List<C>> mapB

我希望将MapA中的值与MapB中的键进行匹配,然后对它们进行合并。合并后的结果应该是:
Map<A,List<C>> mapC

我想知道如何在Java8中使用流来实现。

为了简单起见,我的情况下,A、B和C都是字符串。


5
你尝试过什么吗?读过文档了吗?你遇到了什么具体问题?不考虑语法,你会采取什么策略来实现这个目标? - JB Nizet
2
map.entrySet().stream().collect(Collectors.toMap(Entry::getKey, e -> mapB.get(e.getValue()))) - shmosel
@BillK,我不认为你的解决方案会奏效。我正在尝试从A的值匹配B的键来创建第三个映射表。 - ayush sanghvi
@shmosel,您能否将您的答案发布为答案而不是评论?因为(1)访问者可能会错过像您这样更好的解决方案,(2)我想到了相同的解决方案,但由于您已经在评论中发布了它,所以感到羞愧无地自容。谢谢 :) - Kartik
@Kartik 我通常这样做是因为懒惰地回答了一个懒惰的问题,但如果你愿意,可以将其发布为答案。 - shmosel
显示剩余3条评论
2个回答

4
您可以遍历这张地图并轻松构建新地图。
Map<A,List<C>> mapC = new HashMap<>();

mapA.forEach((key,value)->mapC.put(key, mapB.get(value)));

你可以使用这个链接来比较不同迭代方法的效率,并选择你想要使用的方法。

3
你可以这样做:
mapC = mapA.entrySet()
        .stream()
        .collect(Collectors.toMap(Map.Entry::getKey, e -> mapB.get(e.getValue())));

为什么要创建一个Entry Set,再将其转换为Stream并最终收集它们,如果你可以直接使用Map.forEach获取键值对呢?这样做可以使代码更易理解和简单。 - uneq95
@uneq95 流操作的执行顺序可能与您想象的不同。性能、内存消耗和可读性与您的解决方案相似,甚至更好。 - Kartik
是的,我知道它不按顺序工作。在这里我们也不需要维护顺序,因为我们只想要插入到哈希映射表中,而哈希映射表也不维护顺序。我对首先创建条目集进行了争论。 - uneq95
@uneq95 我所说的是流操作的顺序,例如转换为流、过滤、映射等操作,然后进行收集。我没有谈论结果中元素的排序。尝试提出一个新问题,看看哪个解决方案更好,你会得到它们非常相似的答案。 - Kartik
3
没有"创建"一个entry set的过程,它只是底层map的一种简单视图。 - shmosel
鉴于许多地图都是使用基本上是一组条目的数据结构实现的,您也可以从另一个角度看待它,即“Map”是条目集的替代API。特别是,由于“AbstractMap”的子类需要实现的唯一方法是“entrySet()”,因此可以这样认为。 - Holger

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