Maison > Java > le corps du texte

Le flux Java 8 regroupe par 3 champs et regroupe les deux autres champs par somme

PHPz
Libérer: 2024-02-22 13:46:06
avant
959 Les gens l'ont consulté

L'éditeur php Strawberry vous propose une question et une réponse sur le regroupement des flux par 3 champs et l'agrégation des deux autres champs par la somme en Java 8. Dans la programmation Java, les flux constituent une nouvelle façon de traiter les collections. En utilisant les flux, les données peuvent être exploitées et traitées plus facilement. Cet article présentera en détail comment utiliser la fonction stream de Java 8 pour regrouper par 3 champs et effectuer une agrégation de somme sur les deux autres champs. Explorons ensemble cette question intéressante !

Contenu de la question

Je suis nouveau sur Java 8 et j'ai des difficultés à mettre en œuvre les solutions qui ont été fournies sur des questions similaires. s'il vous plaît, aidez-moi.

Dans Java 8, comment regrouper par trois champs qui renvoie plusieurs lignes qui doivent additionner les deux champs entiers restants. Dans la classe dto/pojo ci-dessous, les champs de nombre entrant et de nombre sortant doivent être additionnés en fonction de la clé unique de la combinaison uuid, msgdate et canal.

public class reportdata {

    private string uuid;
    private string msgdate;
    private string channel;
    private integer incomingcount;
    private integer outgoingcount;
}
Copier après la connexion

//Liste d'initialisation à titre d'exemple.

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 ));
Copier après la connexion

L'objet de sortie doit contenir les données suivantes :

uuid msgdate canal nombre entrant nombre sortant

c9c3a519 décembre 2023 Chiffres 8 3

c9c3a519 novembre 2023 Chiffres 4 4

c9c3a519 Décembre 2023 Manuel 8 3

c9c3a519 novembre 2023 Manuel 4 4

...

...

...

Solution de contournement

Collectez les résultats dans une carte. Cet exemple utilisera Collectors.toMap(keyMapper, valueMapper, mergeFunction, mapFactory).

De plus, par souci de concision, j'utilise l'annotation lombok.

Créez d'abord des classes pour représenter les clés et regroupez les données que vous souhaitez regrouper par :

@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;
  }
}
Copier après la connexion
@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;
  }
}
Copier après la connexion

Ensuite, étendez reportdata avec 2 méthodes supplémentaires pour créer la clé et l'agrégation initiale :

@allargsconstructor
public class reportdata {

  //the fields

  public key createkey() {
    return new key(uuid, msgdate, channel);
  }

  public count createcount() {
    return new count(incomingcount, outgoingcount);
  }
}
Copier après la connexion

et collecter des données :

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());
    }
  }
}
Copier après la connexion

Les paramètres du collecteur sont les suivants :

  1. reportdata::createkey - Créer la clé pour regrouper par (clé de la carte)
  2. reportdata::createcount - Crée un agrégat initial reportdata::createcount - 从单个 reportdata à partir d'un seul
  3. (la valeur de la carte)
  4. count::merge - 在按键冲突时合并两个 count(voir méthode de fusion)
  5. linkedhashmap::new - 用于插入结果的 mapusine. Je souhaite conserver l'ordre d'insertion, mais s'il n'est pas nécessaire, le paramètre peut être omis pour utiliser l'usine par défaut.

Impression :

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
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!