Java 8 POJO-объекты фильтруют pojo на основе общей комбинации нескольких клавиш и суммы в одном поле - PullRequest
1 голос
/ 03 мая 2020

У меня есть класс Sales.

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

Есть список объектов продаж

"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

Что теперь Я пытаюсь достичь общего объема продаж, как показано на картинке выше, как я могу добиться того же, используя java 8. Я пробовал группировать по JAVA 8 функциям, но безуспешно.

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

1 Ответ

2 голосов
/ 03 мая 2020

Вы должны изменить тип, представляющий продажи.

String sales;

должно быть

int sales;

или

long sales;

String не должно быть типом для вещей, которые естественно представлены числами c .

Вы можете использовать groupingBy(), но вы должны применить это к двум отдельным потокам, потому что вы хотите выполнить два вида сумм продаж: сумма продаж по городу штата (строка в вашей таблице) и сумма продаж по месяцам (столбец в вашей таблице).

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))));     
...