editor php Strawberry membawakan anda soalan dan jawapan tentang mengumpulkan aliran mengikut 3 medan dan mengagregatkan dua medan lain mengikut jumlah dalam Java 8. Dalam pengaturcaraan Java, aliran ialah cara baharu memproses koleksi Dengan menggunakan aliran, data boleh dikendalikan dan diproses dengan lebih mudah. Artikel ini akan memperkenalkan secara terperinci cara menggunakan fungsi strim Java 8 untuk mengumpulkan mengikut 3 medan dan melaksanakan pengagregatan jumlah pada dua medan yang lain. Mari kita terokai soalan menarik ini bersama-sama!
Saya baru menggunakan java 8 dan menghadapi kesukaran untuk melaksanakan penyelesaian yang telah disediakan pada soalan yang serupa. tolong bantu.
Dalam java 8, cara mengumpulkan dengan tiga medan yang mengembalikan berbilang baris yang perlu menjumlahkan baki dua medan integer. Dalam kelas dto/pojo di bawah, medan kiraan masuk dan kiraan keluar perlu dijumlahkan berdasarkan kunci unik gabungan uuid, msgdate dan saluran.
public class reportdata { private string uuid; private string msgdate; private string channel; private integer incomingcount; private integer outgoingcount; }
//Senarai permulaan sebagai contoh.
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 ));
Objek output hendaklah mengandungi data berikut:
uuid msgdate saluran kiraan masuk kiraan keluar
c9c3a519 Disember 2023 Nombor 8 3
c9c3a519 November 2023 Nombor 4 4
c9c3a519 Disember 2023 Manual 8 3
c9c3a519 November 2023 Manual 4 4
...
...
...
Kumpulkan keputusan ke dalam peta. Contoh ini akan menggunakan Collectors.toMap(keyMapper, valueMapper, mergeFunction, mapFactory).
Selain itu, untuk ringkasnya, saya menggunakan anotasi lombok.
Mula-mula buat kelas untuk mewakili kunci dan data agregat yang anda mahu kumpulkan mengikut:
@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; } }
Kemudian lanjutkan reportdata
dengan 2 lagi kaedah untuk mencipta kunci dan pengagregatan awal:
@allargsconstructor public class reportdata { //the fields public key createkey() { return new key(uuid, msgdate, channel); } public count createcount() { return new count(incomingcount, outgoingcount); } }
dan kumpul data:
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()); } } }
Parameter pengumpul adalah seperti berikut:
reportdata::createkey
- Cipta kunci kumpulan mengikut (kunci peta) reportdata::createcount
- Mencipta agregat awal reportdata::createcount
- 从单个 reportdata
daripada satu count::merge
- 在按键冲突时合并两个 count
(lihat kaedah cantum)linkedhashmap::new
- 用于插入结果的 map
kilang. Saya mahu mengekalkan susunan sisipan, tetapi jika tidak diperlukan, parameter boleh ditinggalkan untuk menggunakan kilang lalai. Cetakan:
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
Atas ialah kandungan terperinci Kumpulan aliran Java 8 mengikut 3 medan dan agregat dua medan lain mengikut jumlah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!