Der
php-Editor Strawberry bietet Ihnen eine Frage und Antwort zum Gruppieren von Streams nach 3 Feldern und zum Aggregieren der anderen beiden Felder nach der Summe in Java 8. In der Java-Programmierung stellen Streams eine neue Möglichkeit zur Verarbeitung von Sammlungen dar. Durch die Verwendung von Streams können Daten bequemer manipuliert und verarbeitet werden. In diesem Artikel wird detailliert beschrieben, wie Sie die Stream-Funktion von Java 8 verwenden, um nach drei Feldern zu gruppieren und eine Summenaggregation für die anderen beiden Felder durchzuführen. Lassen Sie uns gemeinsam dieser interessanten Frage nachgehen!
Ich bin neu bei Java 8 und habe Schwierigkeiten, die Lösungen zu implementieren, die zu ähnlichen Fragen bereitgestellt wurden. Bitte helfen Sie.
So gruppieren Sie in Java 8 nach drei Feldern, wodurch mehrere Zeilen zurückgegeben werden, die die verbleibenden zwei Ganzzahlfelder summieren müssen. In der folgenden dto/pojo-Klasse müssen die Felder „Incoming Count“ und „Outgoing Count“ basierend auf dem eindeutigen Schlüssel der Kombination aus UUID, Msgdate und Kanal summiert werden.
public class reportdata { private string uuid; private string msgdate; private string channel; private integer incomingcount; private integer outgoingcount; }
//Initialisierungsliste als Beispiel.
List<ReportData> list1 = new ArrayList<>(); list1.add(new ReportData("c9c3a519","December 2023", "digital", 5, 0 )); list1.add(new ReportData("c9c3a519","December 2023", "digital", 3, 0 )); list1.add(new ReportData("c9c3a519","December 2023", "digital", 0, 3 )); list1.add(new ReportData("c9c3a519","November 2023", "digital", 4, 0 )); list1.add(new ReportData("c9c3a519","November 2023", "digital", 0, 4 )); list1.add(new ReportData("c9c3a519","December 2023", "manual", 5, 0 )); list1.add(new ReportData("c9c3a519","December 2023", "manual", 3, 0 )); list1.add(new ReportData("c9c3a519","December 2023", "manual", 0, 3 )); list1.add(new ReportData("c9c3a519","November 2023", "manual", 4, 0 )); list1.add(new ReportData("c9c3a519","November 2023", "manual", 0, 4 )); list1.add(new ReportData("3de4c44f","December 2023", "digital", 5, 0 )); list1.add(new ReportData("3de4c44f","December 2023", "digital", 0, 3 )); list1.add(new ReportData("3de4c44f","November 2023", "digital", 4, 0 )); list1.add(new ReportData("3de4c44f","November 2023", "digital", 0, 4 )); list1.add(new ReportData("3de4c44f","December 2023", "manual", 5, 0 )); list1.add(new ReportData("3de4c44f","December 2023", "manual", 0, 3 )); list1.add(new ReportData("3de4c44f","November 2023", "manual", 4, 0 )); list1.add(new ReportData("3de4c44f","November 2023", "manual", 0, 4 ));
Das Ausgabeobjekt sollte folgende Daten enthalten:
uuid msgdate Kanal eingehende Anzahl ausgehende Anzahl
c9c3a519 Dezember 2023 Zahlen 8 3
c9c3a519 November 2023 Zahlen 4 4
c9c3a519 Dezember 2023 Handbuch 8 3
c9c3a519 November 2023 Handbuch 4 4
...
...
...
Sammeln Sie die Ergebnisse in einer Karte. In diesem Beispiel wird Collectors.toMap(keyMapper, valueMapper, mergeFunction, mapFactory) verwendet.
Außerdem verwende ich der Kürze halber die Lombok-Annotation.
Erstellen Sie zunächst Klassen, um die Schlüssel und aggregierten Daten darzustellen, nach denen Sie gruppieren möchten:
@allargsconstructor @getter public class count { private final int in; private final int out; public count merge(count other) { return new count(this.in + other.in, this.out + other.out); } @override public string tostring() { return in + " " + out; } }
@allargsconstructor public class key { private final string uuid; private final string date; private final string channel; @override public int hashcode() { return objects.hash(uuid, date, channel); } @override public boolean equals(object obj) { if (this == obj) { return true; } if (!(obj instanceof key)) { return false; } key other = (key) obj; return uuid.equals(other.uuid) && date.equals(other.date) && channel.equals(other.channel); } @override public string tostring() { return uuid + " " + date + " " + channel; } }
Erweitern Sie reportdata
dann um zwei weitere Methoden, um den Schlüssel und die anfängliche Aggregation zu erstellen:
@allargsconstructor public class reportdata { //the fields public key createkey() { return new key(uuid, msgdate, channel); } public count createcount() { return new count(incomingcount, outgoingcount); } }
und Daten sammeln:
public class somain { public static void main(string[] args) { list<reportdata> list = new arraylist<>(); //populate the list map<key, count> result = list.stream() .collect(collectors.tomap(reportdata::createkey, reportdata::createcount, count::merge, linkedhashmap::new)); for (map.entry<key, count> entry : result.entryset()) { system.out.println(entry.getkey() + " " + entry.getvalue()); } } }
Die Parameter des Kollektors sind wie folgt:
reportdata::createkey
- Erstellen Sie den Schlüssel zum Gruppieren nach (Schlüssel der Karte) reportdata::createcount
– Erstellt ein anfängliches Aggregat reportdata::createcount
- 从单个 reportdata
aus einem einzelnen count::merge
- 在按键冲突时合并两个 count
(siehe Zusammenführungsmethode)linkedhashmap::new
- 用于插入结果的 map
Fabrik. Ich möchte die Einfügereihenfolge beibehalten, aber wenn sie nicht benötigt wird, kann der Parameter weggelassen werden, um die Standardfabrik zu verwenden. Drucken:
c9c3a519 December 2023 digital 8 3 c9c3a519 November 2023 digital 4 4 c9c3a519 December 2023 manual 8 3 c9c3a519 November 2023 manual 4 4 3de4c44f December 2023 digital 5 3 3de4c44f November 2023 digital 4 4 3de4c44f December 2023 manual 5 3 3de4c44f November 2023 manual 4 4
Das obige ist der detaillierte Inhalt vonJava 8-Stream gruppiert nach 3 Feldern und aggregiert die anderen beiden Felder nach der Summe. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!