【问题标题】:Grouping and adding up BigDecimals using Java Stream API使用 Java Stream API 对 BigDecimal 进行分组和累加
【发布时间】:2019-04-11 11:14:05
【问题描述】:

我有一个Income 对象列表。他们每个人都有一个type。我想将它们分组并总结amount字段。

对于这种情况:

Income income1 = new Income();
income1.setType(IncomeType.COMMON);
income1.setAmount(BigDecimal.valueOf(1000));

Income income2 = new Income();
income2.setType(IncomeType.COMMON);
income2.setAmount(BigDecimal.valueOf(2000));

Income income3 = new Income();
income3.setType(IncomeType.MARCIN);
income3.setAmount(BigDecimal.valueOf(100));

List<Income> incomes = Arrays.asList(income1, income2, income3);

预期的输出将是一个包含两个元素的地图Map&lt;IncomeType, BigDecimal&gt;&lt;COMMON, 3000&gt;&lt;MARCIN, 100&gt;

如何用 Java Stream API 实现?

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

    最简单的解决方案是使用 Collectors::toMap 包括合并功能。

    Map<IncomeType, BigDecimal> grouping = incomes.stream()
        .collect(Collectors.toMap(Income::getType, Income::getAmount, BigDecimal::add));
    

    【讨论】:

      【解决方案2】:

      分组由groupingBy 完成,它允许“下游收集器”进行求和。

      incomes.stream()
          // to map, you say?
          .collect(Collectors.groupingBy(Income::getType, 
              // add the big integers
              Collectors.reducing(BigDecimal.ZERO, Income::getAmount, BigDecimal::add)));
      

      【讨论】:

        【解决方案3】:

        其他方式可能是这样的:

        Map<IncomeType,BigDecimal> map = new HashMap<>();
        incomes.forEach(income ->map.merge(income.getType(),income.getAmount(),BigDecimal::add));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-24
          相关资源
          最近更新 更多