Heim > Java > Hauptteil

Java 8-Stream gruppiert nach 3 Feldern und aggregiert die anderen beiden Felder nach der Summe

PHPz
Freigeben: 2024-02-22 13:46:06
nach vorne
960 Leute haben es durchsucht

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!

Frageninhalt

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;
}
Nach dem Login kopieren

//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 ));
Nach dem Login kopieren

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

...

...

...

Workaround

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;
  }
}
Nach dem Login kopieren
@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;
  }
}
Nach dem Login kopieren

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);
  }
}
Nach dem Login kopieren

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());
    }
  }
}
Nach dem Login kopieren

Die Parameter des Kollektors sind wie folgt:

  1. reportdata::createkey - Erstellen Sie den Schlüssel zum Gruppieren nach (Schlüssel der Karte)
  2. reportdata::createcount – Erstellt ein anfängliches Aggregat reportdata::createcount - 从单个 reportdata aus einem einzelnen
  3. (dem Wert der Karte)
  4. count::merge - 在按键冲突时合并两个 count(siehe Zusammenführungsmethode)
  5. 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
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!