datdatyul
Active Coder
I have a problem about writing a java stream by filtering multiple conditions , groupby multiple condition (if possible) and calculating the sum value
I store the values as `Map<String(pId),List<Person>>`
Here is my Person class shown below
Here is the list
What I want to do is to get this result.
Here is group dto shown below
Here is my dto shown below.
Here is the code snippet but I cannot handle with it.
Here is the same result
Normally, total persons in month 1 is 3 but it counts 4 with respect to status.
My Issue : I cannot count the person, It counts by status. How can I do that?
I store the values as `Map<String(pId),List<Person>>`
Here is my Person class shown below
Code:
public class Person{
private String id;
private Statement event; // STATUS1,STATUS2
private LocalDate eventDate;
private Object value;
}
Here is the list
Code:
ID,Info,Date,Value (All values are stored in Person object defined in the List)
per1, STATUS1, 10-01-2022, 1
per2, STATUS2, 10-01-2022, 2
per3, STATUS3, 10-01-2022, 3
per1, STATUS1, 10-01-2022, 1
per1 STATUS1, 10-02-2022, 1
per2, STATUS1, 10-03-2022, 1
per3, STATUS2, 10-03-2022, 2
...
...
What I want to do is to get this result.
Code:
Month | Total Sum | Person Count
1 7 3
2 1 1
3 3 2
Code:
public class GroupDto {
private int month;
private String id;
}
Here is my dto shown below.
Code:
public class DTO {
private int month;
private BigDecimal totalSum;
private int totalPersons;
}
Here is the code snippet but I cannot handle with it.
Code:
List<Dto> group = employees.values().stream()
.flatMap(List::stream)
.filter(emp -> emp.getEvent() == Value.STATUS1 || emp.getEvent() == Value.STATUS2
|| emp.getEvent() == Value.STATUS3 )
.map(emp -> new Dto(emp.getEventDate().getMonthValue(), new BigDecimal(emp.getValue().toString()), 1))
.collect(Collectors.toList());
List<Dto> result = new ArrayList<>(group.stream()
.collect(Collectors.toMap(
dto -> Arrays.asList(dto.getMonth()), Function.identity(), Dto::aggregate))
.values()).stream().sorted(Comparator.comparing(Dto::getMonth))
.collect(Collectors.toList());
public static Dto aggregate(Dto initial, Dto next) {
initial.setTotalSalary(initial.getTotalSalary().add(next.getTotalSalary()));
initial.setTotalEmployees(initial.getTotalEmployees() + next.getTotalEmployees());
return initial;
}
result.forEach(System.out::println);
Here is the same result
Code:
Dto{month=1, totalSalary=7, totalPersons=4}
Dto{month=2, totalSalary=1, totalPersons=1}
Dto{month=3, totalSalary=3, totalPersons=2}
My Issue : I cannot count the person, It counts by status. How can I do that?