Java 8 流:转换复杂的映射

6
我有一个这样结构的地图:Map<R,Map<S,Map<D,K>>>,我需要将其转换为 Map<R,Map<D,Map<S,K>>>,你有什么办法用streams实现它吗? 在我的情况下,它看起来如下:Map<Long,Map<String,Map<Long,Double>>>
数据如下:
{1->{"m"->{2->3.0},{3->1.0},{4->2.0}}}
{1->{"n"->{2->1.0},{3->2.2},{5->3.2}}}


谢谢。


2
完全取决于您所期望的映射。看到一个示例可能会很有帮助,而不仅仅是神秘的“R S D K”。 - luk2302
1
这并非总是可能的。如果有类似的D键与不同的S键相关联,该怎么办? - Alexis C.
1
根据您提供的输入数据,使用地图结构Map<R,Map<S,Map<D,K>>>无法表示,因为您对于相同的R键(1)有两个值。 - Klitos Kyriacou
1个回答

4

首先,似乎外部地图层级不参与转换,因此让我们暂时忘记它。你有一个 Map<S,Map<D,K>>,你想把它变成 Map<D,Map<S,K>>。你可以尝试以下方法:

Map<S,Map<D,K>> src = ...;
Map<D,Map<S,K>> dest = src.entrySet().stream() // Stream<Map.Entry<S,Map<D,K>>>
    .flatMap(eO -> {
        final S curS = eO.getKey();
        return eO.getValue().entrySet().stream() // Stream<Map.Entry<D,K>>
            .map(eI -> new Object[] { curS, eI.getKey(), eI.getValue() });
            // Stream<Object[]{S,D,K}> for this S
    }) // Stream<Object[]{S,D,K}> for all S
    .collect(Collectors.groupingBy(
            arr -> (D)arr[1], // What to group by in the outer level
            Collectors.toMap( // What to do with the inner level values for each D
                arr -> (S)arr[0], // Keys for the inner map
                arr -> (K)arr[2]  // Values for the inner map
    )));

当然,由于使用了强制类型转换,代码可能会显得有些笨拙,但这样可以避免需要一个类型安全的3元组类。请仔细查看代码,因为我离任何Java编译器都很远,但我认为它应该能做到你想要的。


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