java - 流收集操作可以是特定的 POJO 而不是 Map 吗?

标签 java java-8 java-stream

我想对多个字段进行分组并生成 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>

最佳答案

作为 groupingBy 的第一个参数,发送创建目标 POJO 的 lambda,并使用 summarizingDouble 收集器作为第二个参数。之后,您必须遍历结果 map 并设置统计信息

Map<GroupByYearMonthStageDTO, DoubleSummaryStatistics> collect = list.stream()
            .collect(groupingBy(d -> new GroupByYearMonthStageDTO(d.getYear(), d.getMonth(), d.getStage()),
                            summarizingDouble(DealDTO::getAmount)));

collect.forEach(GroupByYearMonthStageDTO::setStatistics);
Set<GroupByYearMonthStageDTO> groupByYearMonthStageDTOS = collect.keySet();

关于java - 流收集操作可以是特定的 POJO 而不是 Map 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56045579/

相关文章:

Java文件存储实现

java - QNX 上的 Apache Nifi

java - 从 JDK 1.7 开始,从 catch block 中抛出异常对象不需要 throws 子句!!!为什么会这样?

java - 我可以通过作为流项目字段的 int 值的总数来限制 Java Stream 长度吗?

lambda - 使用 JDK8 和 lambda 压缩流 (java.util.stream.Streams.zip)

java - 对 Java 8 流进行分区

java - 在 Java 8 中如何从 N 个数字中找到最大的 M 个数字?

java - 按 Enter 键后 Eclipse 向导关闭

java - Hadoop 文本输出格式 : add headers to CSV output

java - 使用流和 lambda 表达式从文件中提取数字