【发布时间】:2019-05-08 16:53:20
【问题描述】:
我想对多个字段进行分组并生成一个 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>
【问题讨论】:
-
什么是
DealDTO?在OriginalPojo的列表中,您正在代码中对TargetPojo的属性执行操作,这不太有意义。请进一步澄清问题。 -
DealDTO 是原始 POJO。它包含 groupingBy 操作中引用的所有方法。
标签: java java-8 java-stream