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

Mar*_*ert 3 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);
Run Code Online (Sandbox Code Playgroud)

预期的输出将是一个Map<IncomeType, BigDecimal>包含两个元素的地图: <COMMON, 3000><MARCIN, 100>

如何使用Java Stream API实现它?

Flo*_*own 8

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

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