Вводит ли Stream API в Java элементы функционального программирования?

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

Ответ

Да, Stream API (Java 8+) внедряет ключевые концепции функционального программирования (FP) в Java, остающейся преимущественно объектно-ориентированным языком.

Основные FP-признаки в Stream API:

  • Функции как объекты первого класса: Использование лямбда-выражений и ссылок на методы.
  • Безопасные операции: Промежуточные операции (filter, map) должны быть stateless (без побочных эффектов).
  • Ленивые вычисления (lazy evaluation): Промежуточные операции выполняются только при вызове терминальной операции (collect, forEach).
  • Иммутабельность данных: Исходная коллекция не изменяется; создается новый результат.

Пример функционального стиля:

List<String> result = sourceList.stream()
    .filter(s -> s.length() > 3)       // Лямбда-предикат
    .map(String::toUpperCase)          // Ссылка на метод
    .collect(Collectors.toList());     // Терминальная операция
// sourceList остается неизменной

Почему это гибрид, а не чистое FP: Stream API интегрирован в ООП-среду, использует итераторы внутри и не обеспечивает полной иммутабельности всех структур данных языка.