2 回答

TA貢獻2003條經驗 獲得超2個贊
沒有流,有些事情會更容易完成:
Map<Product, Map<Center, Value>> result = new HashMap<>();
given.forEach((c, pv) -> pv.forEach((p, v) ->
result.computeIfAbsent(p, k -> new HashMap<>()).put(c, v)));

TA貢獻1820條經驗 獲得超3個贊
不幸的是,如果您想繼續使用流方法,則不可避免地要創建某種類型的中間對象Triple,即 ie 或AbstractMap.SimpleEntry任何其他適用的類型。
您實際上是在尋找類似 C# 的匿名類型的東西,即您可以映射到
new { k1 = entry.getKey(), k2 = e.getKey(), k3 = e.getValue()) }
然后立即訪問groupingByandtoMap階段的那些。
Java有類似但不完全的東西,你可以這樣做:
Map<Product, Map<Center, Value>> result =
given.entrySet()
.stream()
.flatMap(entry -> entry.getValue()
.entrySet().stream()
.map(e -> new Object() {
Center c = entry.getKey();
Product p = e.getKey();
Value v = e.getValue();
}))
.collect(Collectors.groupingBy(o -> o.p, Collectors.toMap(o -> o.c, o -> o.v)));
歸功于@shmosel。
唯一的好處是您不需要預定義自定義類。
添加回答
舉報