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

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

PHPz
PHPznach vorne
2024-02-22 13:46:061022Durchsuche

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;
}

//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

...

...

...

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;
  }
}
@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:

  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

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen