使用Java Stream API对BigDecimals进行分组和添加

时间:2018-05-16 06:04:03

标签: java java-8 java-stream

我有一个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<IncomeType, BigDecimal><COMMON, 3000><MARCIN, 100>

如何使用Java Stream API实现它?

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

分组由groupingBy完成,它允许&#34;下游收集器&#34;可以做总结。

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

答案 2 :(得分:0)

其他方式可能是这样的:

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