Я хотел бы сгруппировать по нескольким полям и создать, и вывод, который является POJO.
Исходный POJO выглядит примерно так:
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class DealDTO {
@EqualsAndHashCode.Include
private String id;
private Float amount;
private Date closeDate;
private String stage;
public int getYear() {
return getLocalDate().getYear();
}
public int getMonth() {
return getLocalDate().getMonthValue();
}
private LocalDate getLocalDate() {
return getCloseDate().toInstant()
.atZone(ZoneId.systemDefault()).toLocalDate();
}
}
Целевой POJO
@Data
public class GroupByYearMonthStageDTO {
private int year;
private int month;
private String stage;
private DoubleSummaryStatistics statistics;
}
Код ниже производит ожидаемую группировку:
List<DealDTO> list;
var grouping = list.stream().collect(
groupingBy(DealDTO::getYear,
groupingBy(DealDTO::getMonth,
groupingBy(DealDTO::getStage, summarizingDouble(DealDTO::getAmount)))));
Но ..... группировка имеет тип:
Map<Integer, Map<Integer, Map<String, DoubleSummaryStatistics>>>
Я хотел бы посмотреть, есть лив операции сбора есть способ изменить выходные данные, чтобы иметь окончательный тип группировки:
List<GroupByYearMonthStageDTO>