Beh*_*oth 6 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}}}
Run Code Online (Sandbox Code Playgroud)
谢谢.
首先,外部地图关卡似乎不参与变换,所以我们暂时忽略它。你已经有了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
)));
Run Code Online (Sandbox Code Playgroud)
当然,由于使用了强制转换,代码可能看起来有点尴尬,但它避免了对类型安全的三元组类的需要。深入研究代码,因为我没有使用任何 Java 编译器,但我认为它应该做你想做的事情。
| 归档时间: |
|
| 查看次数: |
948 次 |
| 最近记录: |