Что такое функциональное программирование в Java и как его применять?

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

Ответ

Функциональное программирование в Java — это парадигма, основанная на использовании чистых функций, неизменяемых данных и функций высшего порядка. С Java 8 она стала полноценной частью языка.

Основные инструменты:

  1. Лямбда-выражения — анонимные функции

    Function<Integer, Integer> square = x -> x * x;
    Predicate<String> isLong = s -> s.length() > 10;
  2. Stream API — декларативная обработка коллекций

    
    List<String> names = Arrays.asList("John", "Alice", "Bob", "Alexandra");

List result = names.stream() .filter(name -> name.length() > 3) // промежуточная операция .map(String::toUpperCase) // промежуточная операция .sorted() // промежуточная операция .collect(Collectors.toList()); // терминальная операция


3. **Функциональные интерфейсы** (`java.util.function`)
- `Function<T,R>` — принимает T, возвращает R
- `Predicate<T>` — принимает T, возвращает boolean
- `Consumer<T>` — принимает T, ничего не возвращает
- `Supplier<T>` — ничего не принимает, возвращает T

4. **Optional** — безопасная работа с null
```java
Optional<String> optional = Optional.ofNullable(getName());
String result = optional
    .filter(s -> s.length() > 5)
    .map(String::toUpperCase)
    .orElse("DEFAULT");
  1. Records (Java 14+) — иммутабельные DTO
    public record Person(String name, int age) {}
    // Автоматически: конструктор, equals(), hashCode(), toString()

Best practices:

  • Предпочитайте неизменяемые данные
  • Используйте чистые функции (без side effects)
  • Комбинируйте небольшие функции в более сложные
  • Избегайте изменения внешнего состояния в лямбдах

Преимущества:

  • Более читаемый и выразительный код
  • Упрощение параллельных вычислений
  • Упрощение тестирования (чистые функции)
  • Меньше ошибок, связанных с изменяемым состоянием