繁体   English   中英

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

[英]Grouping and adding up BigDecimals using Java Stream API

我有一个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>的映射Map<IncomeType, BigDecimal>包含两个元素: <COMMON, 3000><MARCIN, 100>

如何使用Java Stream API实现它?

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

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

分组是通过groupingBy完成的,它允许一个可以进行求和的“下游收集器”。

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

其他方式可能是这样的:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM