1. Обзор
Обычно мы используем Java Stream API для обработки коллекций данных.
Одной приятной функцией является поддержка операций с числовыми потоками, таких как операция суммирования .
Однако мы не можем обрабатывать все числовые типы таким образом.
В этом руководстве мы увидим, как выполнять операцию суммирования
с потоками чисел, такими как BigDecimal
.
2. Как мы обычно суммируем поток
Stream API предоставляет потоки чисел, включая IntStream,
DoubleStream и LongStream.
Давайте напомним себе, как они работают, создав
числовой поток. Затем мы вычислим его итог с помощью IntStream#sum
:
IntStream intNumbers = IntStream.range(0, 3);
assertEquals(3, intNumbers.sum());
Мы можем сделать то же самое, начав со списка Double
s. Используя потоки, мы можем преобразовать объектный поток в 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. Использование сокращения для добавления больших десятичных
чисел
Вместо того, чтобы полагаться на сумму
, мы можем использовать 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);
Метод сокращения
принимает два параметра:
Identity
— эквивалент0
— это начальное значение для сокращенияФункция аккумулятора
— принимает два параметра: текущий результат и следующий элемент потока.
4. Вывод
В этой статье мы рассмотрели, как найти сумму некоторых чисел в числовом потоке
. Затем мы обнаружили, как использовать сокращение
в качестве альтернативы.
Использование сокращения
позволяет нам суммировать набор чисел BigDecimal .
Его можно применить к любому другому типу.
Как всегда, код примеров доступен на GitHub .