我有一个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实现它?
答案 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));