«1. Обзор

Мы обычно используем Java Stream API для обработки коллекций данных.

Одной приятной особенностью является поддержка операций над числовыми потоками, таких как операция суммирования. Однако мы не можем обрабатывать все числовые типы таким образом.

В этом уроке мы увидим, как выполнять операцию суммирования с потоками чисел, такими как BigDecimal.

2. Как мы обычно суммируем поток

Stream API предоставляет потоки чисел, включая IntStream, DoubleStream и LongStream.

Давайте вспомним, как они работают, создав числовой поток. Затем мы вычислим его итог с помощью IntStream#sum:

IntStream intNumbers = IntStream.range(0, 3);
assertEquals(3, intNumbers.sum());

Мы можем сделать то же самое, начав со списка двойников. Используя потоки, мы можем преобразовать поток объектов в DoubleStream, используя mapToDouble:

List<Double> doubleNumbers = Arrays.asList(23.48, 52.26, 13.5);
double result = doubleNumbers.stream()
    .mapToDouble(Double::doubleValue)
    .sum();
assertEquals(89.24, result, .1);

Итак, было бы полезно, если бы мы могли суммировать набор чисел BigDecimal таким же образом.

К сожалению, BigDecimalStream не существует. Итак, нам нужно другое решение.

3. Использование Reduce для сложения чисел BigDecimal

Вместо того, чтобы полагаться на сумму, мы можем использовать Stream.reduce:

Stream<Integer> intNumbers = Stream.of(5, 1, 100);
int result = intNumbers.reduce(0, Integer::sum);
assertEquals(106, result);

Это работает со всем, что можно логически сложить вместе, включая BigDecimal:

Stream<BigDecimal> bigDecimalNumber = 
  Stream.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN);
BigDecimal result = bigDecimalNumber.reduce(BigDecimal.ZERO, BigDecimal::add);
assertEquals(11, result);

Метод сокращения принимает два параметра:

    Идентичность — эквивалентно 0 — это начальное значение для редукционной функции Аккумулятор — принимает два параметра, текущий результат и следующий элемент потока

4. Заключение

В этой статье мы рассмотрели, как найти сумму некоторых чисел в числовом потоке. Затем мы обнаружили, как использовать сокращение в качестве альтернативы.

Использование сокращения позволяет нам суммировать набор чисел BigDecimal. Его можно применить к любому другому типу.

Как всегда, код примеров доступен на GitHub.