Перейти к основному содержимому

Добавьте BigDecimals с помощью Stream API

· 2 мин. чтения

Задача: Медиана двух отсортированных массивов

Даны два отсортированных массива размерами n и m. Найдите медиану слияния этих двух массивов.
Временная сложность решения должна быть O(log(m + n)) ...

ANDROMEDA

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 .