2016-02-27 78 views
5

分組我有一些很難找到使用Stream API以下一個好辦法/實施:的Java 8流:採用聚集

我有元素的列表,由一個字符串和一個整數的每個元素。現在我想按照它們的字符串值對元素進行分組,然後對於每個組,我喜歡從與該組相關的元素中獲得整數值的總和。

實施例:我有以下3個元素:

("GroupA", 100) ("GroupA", 50) ("GroupB", 10) 

正如我想獲得的地圖由以下兩種(鍵,值)對結果:

("GroupA, 150) ("GroupB, 10) 

我我不知道如何解決這個問題。最有前途的我到目前爲止是這樣的:

elements.stream().collect(Collectors.groupingBy(e-> e.getGroup())) 
      .merge(group, elementsOfTheGroup, (...)); 

但我不知道什麼函數插入作爲合併方法的最後一個參數。但我不知道我是否應該使用合併方法。

這將是最優雅的實施?

回答

8

您需要將下游收集器添加到Collectors.groupingBy(classifier, downstream)。這些收藏家收集被分類到同一把鑰匙的所有元素。在這種情況下,我們只需要使用Collectors.summingInt(mapper)將所有數字相加在一起,其中映射器是將數字返回到總和的函數。

假設這個數字與吸氣getNumber()檢索,你可以有:

Map<String, Integer> result = 
    elements.stream().collect(Collectors.groupingBy(
     e -> e.getGroup(), 
     Collectors.summingInt(e -> e.getNumber()) 
    )); 

你可以使用的方法引用,而不是上述兩種lambda表達式。例如,如果元素的類是Element例如,您將有

Map<String, Integer> result = 
    elements.stream().collect(Collectors.groupingBy(
     Element::getGroup, 
     Collectors.summingInt(Element::getNumber) 
    )); 
+0

太好了,謝謝! – user3237736