ich eine Sammlung von Rechnungen haben:Java 8 Stream - Sammlungen von Objekten verschmelzen die gleiche Id teilen
class Invoice {
int month;
BigDecimal amount
}
Ich möchte diese Rechnungen fusionieren, so dass ich eine Rechnung pro Monat, und die Menge die Summe der Rechnungsbeträge für diesen Monat.
Zum Beispiel:
invoice 1 : {month:1,amount:1000}
invoice 2 : {month:1,amount:300}
invoice 3 : {month:2,amount:2000}
Ausgang:
invoice 1 : {month:1,amount:1300}
invoice 2 : {month:2,amount:2000}
Wie kann ich das mit Java-8-Streams?
EDIT: als meine Rechnungsklasse wandelbar und es war kein Problem, sie zu ändern, habe ich mich für Eugens Lösung
Collection<Invoice> invoices = list.collect(Collectors.toMap(Invoice::getMonth, Function.identity(), (left, right) -> {
left.setAmount(left.getAmount().add(right.getAmount()));
return left;
})).values();
oder verwenden Sie 'Collectors.collectingAndThen (Collectors.toMap (...), m-> neue ArrayList <> (m.values ()))' ... – Holger
@Holger guter Punkt! bearbeitet ... – Eugene
Hallo! 2 Kommentare ... 1) Vielleicht sollte es "list.stream(). Sammeln (...)" und 2) Sie mutieren die ursprünglichen 'Rechnung' Elemente, das sieht für mich nicht korrekt ... Sie könnte es lösen, indem Sie einen Kopierkonstruktor hinzufügen und im Wert-Mapper verwenden –