gpt4 book ai didi

java - 使用 Java 8 lambdas/transformations 组合和展平两个 Map

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:22:33 26 4
gpt4 key购买 nike

我有两张 map :

  • Map<A, Collection<B>> mapAB
  • Map<B, Collection<C>> mapBC

我想将它们转换成 Map<A, Collection<C>> mapAC我想知道是否有一种平滑的方法可以使用 lambda 和转换来做到这一点。在我的特殊情况下,集合都是集合,但我想解决一般集合的问题。

我的一个想法是首先将两个 map 组合成一个 Map<A, Map<B, Collection<C>>>然后将其展平,但我对任何方法都持开放态度。

数据说明:B应该只出现在与一个 A 关联的值集合中,mapBC也是如此(给定的 C 仅映射到一个 B )。因此,给定的 A 应该只有一条路径。给定 C , 虽然可能有 A -> B没有 B -> C 的映射映射,并且可能有 B -> C没有对应的映射 A -> B映射。这些孤儿根本不会出现在结果 mapAC 中.

为了比较,这里有一个针对同一问题的纯命令式方法的示例:

Map<A, Collection<C>> mapAC = new HashMap<>();

for (Entry<A, Collection<B>> entry : mapAB.entrySet()) {
Collection<C> cs = new HashSet<>();

for (B b : entry.getValue()) {
Collection<C> origCs = mapBC.get(b);
if (origCs != null) {
cs.addAll(origCs);
}
}

if (!cs.isEmpty()) {
mapAC.put(entry.getKey(), cs);
}
}

最佳答案

如果第一个 map 中的某些 b 在第二个 map 中不存在,您没有指定要执行的操作,因此这可能不是您要查找的内容。

mapAB.entrySet().stream()
.filter(e -> e.getValue().stream().anyMatch(mapBC::containsKey))
.collect(toMap(
Map.Entry::getKey,
e->e.getValue().stream()
.filter(mapBC::containsKey)
.map(mapBC::get)
.flatMap(Collection::stream)
.collect(toList())
));

关于java - 使用 Java 8 lambdas/transformations 组合和展平两个 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30946205/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com