Saya memiliki kelas Penjualan.

Class Sales {
String month; String year; String city; String state; String sales;
}

Memiliki daftar objek Penjualan

"result" :[ 

{
"month" : "JAN",
"year":  "2000",
"state" : "State1",
"city" :  "City1",
"sales" : "10"
}, 
{
"month" : "JAN",
"year" :  "2000",
"state" : "State1",
"city" :  "City2",
"sales" : "20"
},
{
"month" : "JAN",
"year" :  "2000",
"state" : "State2",
"city" :  "City3",
"sales" : "30",
},
{
"month" : "JAN",
"year" :  "2000",
"state" : "State2",
"city" :  "City1",
"sales" : "40"
},
{
"month" : "FEB",
"year" :  "2000",
"state" : "State1",
"city" :  "City1",
"sales" : "5",
},
{
"month" : "FEB",
"year" :  "2000",
"state" : "State1",
"city" :  "City2",
"sales" : "15"
}
]

It would be represented as below picture

Sekarang yang saya coba capai adalah total penjualan seperti yang digambarkan pada gambar di atas, bagaimana saya bisa mencapai hal yang sama menggunakan Java 8. Saya mencoba mengelompokkan berdasarkan fitur JAVA 8, tetapi tidak berhasil.

    list.stream()
          .collect(Collectors.groupingBy(p -> p.getMonth(), Collectors.groupingBy(p -> p.getSales(),
                                            Collectors.summingInt(foo->foo.getTotalSales()))))
          .forEach((id,total)->System.out.println(id+"\t"+total));
0
vidyashi 3 Mei 2020, 21:53

1 menjawab

Jawaban Terbaik

Anda harus mengubah jenis yang mewakili penjualan.

String sales;

Seharusnya

int sales;

Atau

long sales;

String seharusnya bukan tipe untuk hal-hal yang secara alami diwakili oleh tipe numerik.

Anda dapat menggunakan groupingBy() tetapi Anda harus menerapkannya pada dua aliran berbeda karena Anda ingin melakukan dua jenis jumlah penjualan: jumlah penjualan menurut negara bagian-kota (baris di spreadsheet Anda) dan jumlah penjualan menurut bulan (kolom di lembar kerja Anda).

Map<String, Integer> salesAmountByMonth = 
list.stream()
    .collect(groupingBy(Sale::getMonth,
                        summingInt(Sale::getSales)));  

Map<String, Map<String,Integer>> salesAmountByStateByCity = 
list.stream()
    .collect(groupingBy(Sale::getState,
                        groupingBy(Sale::getCity,
                                   summingInt(Sale::getSales))));     
1
davidxxx 3 Mei 2020, 21:36