我有一个具有这种结构的地图: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}}}
感谢。
答案 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编译器,但我认为它应该按照你想要的去做。