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

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

PHPz
PHPzke hadapan
2024-02-22 13:46:06961semak imbas

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

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

...

...

...

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

  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

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam