【发布时间】:2015-06-19 19:50:04
【问题描述】:
我有两张地图:
Map<A, Collection<B>> mapABMap<B, Collection<C>> mapBC
我想将它们转换为 Map<A, Collection<C>> mapAC,我想知道是否有一种使用 lambda 和转换的平滑方法。在我的特殊情况下,集合都是集合,但我想解决一般集合的问题。
我的一个想法是首先将这两个地图组合成一个Map<A, Map<B, Collection<C>>>,然后将其展平,但我对任何方法都持开放态度。
数据说明:B 应该只出现在与一个A 关联的值集合中,mapBC 也是如此(给定的C 仅映射到一个B)。因此,从给定的A 到给定的C 应该只有一条路径,尽管可能存在没有B -> C 映射的A -> B 映射,并且可能存在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);
}
}
【问题讨论】:
-
你想要一个没有中间列的两个一对多关系的连接吗?
-
@MikeSamuel 是的,这绝对是一种看待它的方式。
-
您能添加数据示例吗?例如,如果我们有
Map<Person, Set<Job>>和Map<Job, Set<Tool>>,不同的人是否有可能拥有相同的工作,或者少数工作使用相同的工具?那么像p1 -> {j1, j2}, p2->{j2, j3}这样的可能吗?还有job1->{tool1, tool2} job2->{tool2, tool3} job3->{tool4}?你期待什么结果?您是否还希望Collection<X>成为Set或者元素可以多次存在于其中? -
@Pshemo 请参阅问题中新的“数据说明”部分。
标签: java lambda java-8 java-stream