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

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

Ответ

Метод reduce возвращает один результат — итоговое значение операции свертки. Тип результата определяется типом аккумулятора и может быть как объектом, так и примитивом (с использованием специализированных методов reduce() для IntStream, LongStream, DoubleStream).

1. Свертка к объекту (наиболее общий случай):

List<String> words = Arrays.asList("Hello", " ", "World");
// reduce(identity, accumulator)
String sentence = words.stream()
                       .reduce("", (partialResult, element) -> partialResult + element);
// Возвращает объект String: "Hello World"

2. Свертка к коллекции (не рекомендуется, лучше использовать collect):

List<String> combined = words.stream()
    .reduce(new ArrayList<>(),
            (list, element) -> { list.add(element); return list; },
            (list1, list2) -> { list1.addAll(list2); return list1; });
// Возвращает объект ArrayList<String>

Ключевой момент: reduce предназначен для неизменяемых (immutable) операций свертки (конкатенация, сумма). Для мутабельных аккумуляторов (добавление в коллекцию) следует использовать метод collect, который оптимизирован для таких сценариев и работает эффективнее, особенно в параллельных потоках.