Ответ
Функциональные интерфейсы (имеющие ровно один абстрактный метод) — основа для лямбда-выражений и широко применяются в современных Java API.
Ключевые области применения:
-
Stream API: Для декларативной обработки коллекций.
Predicate<T>— фильтрация:.filter(x -> x > 0)Function<T,R>— преобразование:.map(String::toUpperCase)Consumer<T>— терминальная операция:.forEach(System.out::println)Supplier<T>— генерация потоков:Stream.generate(() -> "item")
-
Многопоточность и асинхронность:
RunnableиCallable<V>— задачи дляExecutorService.executor.submit(() -> System.out.println("Task")); // Runnable
-
Обработка событий и паттерны проектирования:
- В UI-фреймворках (обработчики нажатий кнопок).
- Паттерн Стратегия (Strategy) для инкапсуляции алгоритмов.
public void processData(List<String> data, Function<String, String> processor) { data.stream().map(processor)... }
-
Работа с Optional и отложенные вычисления:
Supplier<T>вOptional.orElseGet(supplier).
-
Сортировка и сравнение:
Comparator<T>— часто используется с лямбдами.list.sort((a, b) -> a.getName().compareTo(b.getName()));
Преимущество: Функциональные интерфейсы позволяют передавать поведение как данные, делая код более гибким, переиспользуемым и лаконичным.