Как использовать метод reduce() в Java Stream API?

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

Ответ

Метод reduce() в Stream API используется для свертки элементов потока в одно итоговое значение с помощью ассоциативной функции.

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

  1. Optional<T> reduce(BinaryOperator<T> accumulator)
  2. T reduce(T identity, BinaryOperator<T> accumulator)
  3. U reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner)

Примеры:

  • Суммирование чисел (с identity):

    List<Integer> numbers = List.of(1, 2, 3, 4, 5);
    int sum = numbers.stream()
                     .reduce(0, (a, b) -> a + b); // Идентичность 0 гарантирует результат int, а не Optional
    System.out.println(sum); // 15

    Или с методом-ссылкой:

    int sum = numbers.stream()
                     .reduce(0, Integer::sum);
  • Поиск максимального значения (без identity):

    Optional<Integer> max = numbers.stream()
                                   .reduce(Integer::max);
    max.ifPresent(System.out::println); // 5
  • Конкатенация строк:

    List<String> words = List.of("Hello", " ", "World", "!");
    String sentence = words.stream()
                           .reduce("", String::concat);
    System.out.println(sentence); // "Hello World!"

Важно: Функция-аккумулятор должна быть ассоциативной, чтобы корректно работать в параллельных потоках.