2 回答

TA貢獻1874條經驗 獲得超12個贊
有點復雜,但它有效:
Map<Y,Map<X,Z>> out =
originalMap.entrySet()
.stream()
.flatMap(e -> e.getValue()
.entrySet()
.stream()
.map(e2 -> {
Map<X,Z> m = new HashMap<>();
m.put(e.getKey(),e2.getValue());
return new SimpleEntry<>(e2.getKey(),m);}))
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,(v1,v2)->{v1.putAll(v2);return v1;}));
Stream基本上,它將原始的Map條目轉換為Stream所需輸出的平面條目Map(其中每個內部Map只有一個Entry),并使用具有合并功能的收集器合并與相同外部鍵對應的toMap內部s Map.
例如,使用以下輸入 Map 運行此代碼:
Map<String,Map<Integer,Double>> originalMap = new HashMap<>();
Map<Integer,Double> inner1 = new HashMap<>();
Map<Integer,Double> inner2 = new HashMap<>();
Map<Integer,Double> inner3 = new HashMap<>();
originalMap.put("aa",inner1);
originalMap.put("bb",inner2);
originalMap.put("cc",inner3);
inner1.put(10,10.0);
inner1.put(20,20.0);
inner1.put(30,30.0);
inner2.put(10,40.0);
inner2.put(20,50.0);
inner2.put(30,60.0);
inner3.put(10,70.0);
inner3.put(20,80.0);
inner3.put(30,90.0);
Map<Integer,Map<String,Double>> out =
originalMap.entrySet()
.stream()
.flatMap(e -> e.getValue()
.entrySet()
.stream()
.map(e2 -> {
Map<String,Double> m = new HashMap<>();
m.put(e.getKey(),e2.getValue());
return new SimpleEntry<>(e2.getKey(),m);}))
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,(v1,v2)->{v1.putAll(v2);return v1;}));
System.out.println (out);
將輸出:
{20={aa=20.0, bb=50.0, cc=80.0}, 10={aa=10.0, bb=40.0, cc=70.0}, 30={aa=30.0, bb=60.0, cc=90.0}}
編輯:
如果您使用的是 Java 9 或更高版本,您可以使用Map.of它來稍微簡化代碼:
Map<Y,Map<X,Z>> out =
originalMap.entrySet()
.stream()
.flatMap(e -> e.getValue()
.entrySet()
.stream()
.map(e2 -> new SimpleEntry<>(e2.getKey(),Map.of(e.getKey(),e2.getValue()))))
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,(v1,v2)->{v1.putAll(v2);return v1;}));

TA貢獻1797條經驗 獲得超4個贊
對我來說,實際上,沒有流,這要容易得多;但仍在使用 java-8 功能(示例取自其他答案):
Map<Integer, Map<String, Double>> result = new HashMap<>();
originalMap.forEach((key, value) -> {
value.forEach((innerKey, innerValue) -> {
Map<String, Double> map = new HashMap<>();
map.put(key, innerValue);
result.merge(innerKey, map, (left, right) -> {
left.putAll(right);
return left;
});
});
});
System.out.println(result);
添加回答
舉報