I have this code
... some code here
while (iterator.hasNext()) {
Document next = iterator.next();
projectNumber = new NpoProjectNumberVM();
localDate = new java.sql.Date(((Date) next.get("_id")).getTime()).toLocalDate();
projectNumber.setDay(localDate);
projectNumber.setNumber(((Long) next.get("number")).intValue());
projectNumberList.add(projectNumber);
}
return projectNumberList;
which displays this result
"projectNumber": [
{
"day": "2022-02-07",
"number": 2
},
{
"day": "2022-02-07",
"number": 1
},
{
"day": "2022-02-07",
"number": 4
},
]
My request is: I want to have the sum of the numbers for the same date like this
"projectNumber": [
{
"day": "2022-02-07",
"number": 7
},
]
CodePudding user response:
You may use a Map
where the key is the date, so you can verify if it exists or not then do the good logic
static List<Document> method() {
Map<LocalDate, Document> projects = new HashMap<>();
while (iterator.hasNext()) {
Document next = iterator.next();
localDate = new java.sql.Date(((Date) next.get("_id")).getTime()).toLocalDate();
int nb = ((Long) next.get("number")).intValue();
if (projects.containsKey(localDate)) {
projects.get(projectNumber).setNumber(nb projects.get(projectNumber).getNumber());
} else {
projectNumber = new NpoProjectNumberVM();
projectNumber.setDay(localDate);
projectNumber.setNumber();
projects.put(localDate, projectNumber);
}
}
return new ArrayList<>(projects.values());
}
CodePudding user response:
Java 8 streams: GroupingBy
Use Java 8 streaming with some of the Collectors
like groupingBy
for the key and summingLong
for the aggregate-function to return a Map<?, Long>
(where ? stands for the key, here LocalDate
):
Map<LocalDate, Long> sumByDay = projectNumberList.stream().collect(
groupingBy(
ProjectNumber::getDay,
summingLong(ProjectNumber::getNumber)
)
);
See also:
JSON output
To produce some JSON output like
"projectNumber": [
{
"day": "2022-02-07",
"number": 7
},
{
"day": "2022-02-01",
"number": 1
}
]
you could use Jackson with a custom Map-serializer.