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 !
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; }
//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 ));
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
...
...
...
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; } }
@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; } }
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); } }
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()); } } }
Les paramètres du collecteur sont les suivants :
reportdata::createkey
- Créer la clé pour regrouper par (clé de la carte) reportdata::createcount
- Crée un agrégat initial reportdata::createcount
- 从单个 reportdata
à partir d'un seul count::merge
- 在按键冲突时合并两个 count
(voir méthode de fusion)linkedhashmap::new
- 用于插入结果的 map
usine. 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
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!