Ответ
Метод 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, который оптимизирован для таких сценариев и работает эффективнее, особенно в параллельных потоках.