Rumah > Java > teks badan

Kumpulan aliran Java 8 mengikut 3 medan dan agregat dua medan lain mengikut jumlah

PHPz
Lepaskan: 2024-02-22 13:46:06
ke hadapan
960 orang telah melayarinya

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!

Kandungan soalan

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;
}
Salin selepas log masuk

//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 ));
Salin selepas log masuk

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

...

...

...

Penyelesaian

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;
  }
}
Salin selepas log masuk
@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;
  }
}
Salin selepas log masuk

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);
  }
}
Salin selepas log masuk

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());
    }
  }
}
Salin selepas log masuk

Parameter pengumpul adalah seperti berikut:

  1. reportdata::createkey - Cipta kunci kumpulan mengikut (kunci peta)
  2. reportdata::createcount - Mencipta agregat awal reportdata::createcount - 从单个 reportdata daripada satu
  3. (nilai peta)
  4. count::merge - 在按键冲突时合并两个 count(lihat kaedah cantum)
  5. 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
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!