2016-02-27 6 views
5

Ich habe einige Probleme, einen guten Ansatz/Implementierung der Suche nach der Stream-API für die folgende Verwendung:Java 8 Streaming: Gruppierung mit Aggregation

ich eine Liste von Elementen, wobei jedes Element, bestehend aus einem String und einer ganzen Zahl. Jetzt möchte ich die Elemente nach ihren String-Werten gruppieren, und dann möchte ich für jede Gruppe die Summe der Integer-Werte von den Elementen haben, die sich auf diese Gruppe beziehen.

Beispiel: Ich habe folgende 3 Elemente:

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

Und als Ergebnis Ich mag, eine Karte erhalten, bestehend aus den folgenden zwei (Schlüssel, Wert) -Paare:

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

I bin mir nicht sicher, wie ich das lösen soll. Die vielversprechendste ich mit so weit kam, ist dies:

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

Aber ich bin nicht sicher, was als letzter Parameter der Merge-Methode zum Einfügen funktionieren. Aber ich weiß nicht, ob ich überhaupt die Merge-Methode verwenden soll.

Was wäre die eleganteste Implementierung dafür?

Antwort

8

Sie müssen einen nachgeschalteten Kollektor zu Collectors.groupingBy(classifier, downstream) hinzufügen. Dieser Sammler sammelt alle Elemente, die in den gleichen Schlüssel klassifiziert wurden. In diesem Fall müssen wir nur alle Zahlen unter Verwendung von Collectors.summingInt(mapper) zusammenfassen, wobei der Mapper eine Funktion ist, die die Summe zurückgibt.

diese Zahl Unter der Annahme, kann mit dem Getter getNumber() abgerufen werden, könnten Sie haben:

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

Sie über ein Verfahren Verweis anstelle der beiden Lambda-Ausdrücke verwenden könnte. Wenn die Klasse der Elemente Element zum Beispiel ist, würden Sie haben

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

groß, danke! – user3237736