Что такое операция reduce в Java Stream API?

«Что такое операция reduce в Java Stream API?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

reduce — это терминальная операция в Java Stream API, которая выполняет свёртку (агрегацию) элементов потока в одно значение, последовательно применяя функцию-аккумулятор.

Основные формы:

  1. С начальным значением (identity):

    T reduce(T identity, BinaryOperator<T> accumulator)
    • identity — начальное значение и результат для пустого потока.
    • accumulator — функция, объединяющая текущий результат и следующий элемент.
      List<Integer> numbers = List.of(1, 2, 3, 4);
      int sum = numbers.stream()
                   .reduce(0, (a, b) -> a + b); // Результат: 10
  2. Без начального значения:

    Optional<T> reduce(BinaryOperator<T> accumulator)
    • Возвращает Optional, так как для пустого потока результата нет.
      Optional<Integer> product = numbers.stream()
                                     .reduce((a, b) -> a * b); // Optional[24]

Ключевые моменты:

  • Использование: сумма, произведение, поиск максимума/минимума, конкатенация строк.
  • Порядок: В параллельных потоках accumulator должен быть ассоциативным, а identityнейтральным элементом (например, 0 для сложения, 1 для умножения).
  • Альтернативы: Для часто используемых операций (sum, max, min) существуют специализированные методы.