Группировка и сложение BigDecimals с использованием Java Stream API - PullRequest
0 голосов
/ 16 мая 2018

У меня есть список 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 голосов
/ 16 мая 2018

Самое простое решение - использовать Collectors::toMap, включая функцию слияния.

Map<IncomeType, BigDecimal> grouping = incomes.stream()
    .collect(Collectors.toMap(Income::getType, Income::getAmount, BigDecimal::add));
0 голосов
/ 16 мая 2018

Другой способ может быть таким:

Map<IncomeType,BigDecimal> map = new HashMap<>();
incomes.forEach(income ->map.merge(income.getType(),income.getAmount(),BigDecimal::add));
0 голосов
/ 16 мая 2018

Группировка выполняется с помощью groupingBy, что позволяет использовать "нисходящий коллектор", который может выполнять суммирование.

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