![](/img/trans.png)
[英]How to merge lists of Map with Lists values using Java Streams API?
[英]How to group values of map into lists based on key with java streams?
假設我有從字符串到從字符串到 int 的映射的映射,例如
Map<String, Map<String, Integer>> myMap1 = new HashMap<>();
myMap1.put("A", Map.of("X", 1))
myMap1.put("B", Map.of("Y", 1))
Map<String, Map<String, Integer>> myMap2 = new HashMap<>();
myMap2.put("B", Map.of("Y", 3))
我想合並這些映射,以便我們得到一個映射,其中鍵是內部映射的鍵,而值將是相同鍵的內部映射值的平均值。 所以上面例子的輸出將是
{"X" : 1, "Y", 2}
我們可以完全丟棄外部映射的鍵。
用 java.time 最好的方法是什么? 我認為使用 Collectors.groupBy 方法可能有一些不錯的方法,但我對此非常缺乏經驗。
我假設可能有兩個以上的地圖,所以讓我們用它們制作一個列表:
Collection<Map<String, Map<String, Integer>>> myMaps =
List.of(myMap1, myMap2);
然后我們可以在每個 Map 的values()
上使用 flatMap,它給我們一個Map<String, Integer>
映射流。
我們可以獲取每個條目的entrySet()
,然后將 flatMap 應用於這些條目集的流,從而為我們提供一個Map.Entry<String, Integer>
對象的 Stream,然后我們可以對其進行分組。
有一個groupingBy 方法,它使用第二個收集器來自定義組的值,通過收集所有看到的分組值。 我們可以使用平均收集器來獲得我們的平均值。
Map<String, Double> averages =
myMaps.stream().flatMap(map -> map.values().stream()) // stream of Map<String, Integer>
.flatMap(innerMap -> innerMap.entrySet().stream()) // stream of Map.Entry<String, Integer>
.collect(Collectors.groupingBy(Map.Entry::getKey, // group by String key
Collectors.averagingInt(Map.Entry::getValue))); // value for each key = average of its Integers
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.