【问题标题】:Collecting to map using Java Stream API使用 Java Stream API 收集到地图
【发布时间】:2020-10-29 10:14:58
【问题描述】:

这是我需要收集的类对象:

public class InvestBalance {

    @JsonValue
    private List<Balance> balances;

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Balance {

        @JsonFormat(pattern = "yyyy-MM-dd")
        private LocalDate date;

        private BigDecimal value;
    }
}

我从数据库中获得了List&lt;InvestBalance.Balance&gt;,我需要按date 字段对它们进行分组,因此我需要获得Map&lt;LocalDate, BigDecimal&gt;。值必须是 bigDecimals 的总和。 我如何使用 Java Stream API 来做到这一点?

【问题讨论】:

  • 您需要更精确。如果你在一个日期有很多价值,你需要什么?一笔?值列表?
  • 如果同一日期有多个值,映射到该日期键的值应该是什么?
  • @notescrew 必须是同一日期的数值之和
  • @BenjaminD 必须是同一日期的值的总和

标签: java stream java-stream


【解决方案1】:
list.stream()
   .collect(Collectors.groupingBy(Balance::getDate,
                       Collectors.mapping(Balance::getValue, 
                                  Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)));

或者使用 Collectors.* 的静态导入以使其更具可读性:

list.stream()
   .collect(groupingBy(Balance::getDate, 
                    mapping(Balance::getValue, reducing(BigDecimal.ZERO, BigDecimal::add)));

【讨论】:

    【解决方案2】:

    您可以使用Collectors.toMap收集为Map

    Map<LocalDate, BigDecimal> res = 
          list.stream()
              .collect(Collectors.toMap(Balance::getDate, Balance::getValue, BigDecimal::add));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      • 2017-09-26
      • 2020-07-02
      相关资源
      最近更新 更多