java 8 stream转换复杂地图

时间:2015-12-24 12:43:59

标签: java java-8 java-stream


   我有一个具有这种结构的地图:Map<R, Map<S, Map<D, K>>>我需要将它转换为Map<R, Map<D, Map<S, K>>>任何想法如何用流实现它?
就我而言,它看起来像: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}}}


感谢。

1 个答案:

答案 0 :(得分: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编译器,但我认为它应该按照你想要的去做。