Функциональные интерфейсы и Stream API
Карта раздела:
- Функциональное программирование — функции, композиция и side effects;
- Функциональные интерфейсы — SAM-контракт и стандартные типы;
- Лямбда выражения — синтаксис и захват переменных;
- Stream API — ленивый pipeline обработки;
- Промежуточные операции — построение pipeline;
- Терминальные операции — запуск вычисления;
- Методы интерфейса Stream — рабочая шпаргалка;
- BaseStream — общий lifecycle object/int/long/double streams.
List<String> ids = orders.stream()
.filter(Order::isPaid)
.map(Order::id)
.distinct()
.toList();До toList() промежуточные операции только описывают вычисление. Терминальная операция запускает обход; один stream нельзя использовать повторно.
Быстрая проверка
Функциональный интерфейс обязан иметь один метод вообще? Один abstract-метод; default/static и методы Object не мешают.
Гарантирует ли stream параллельность? Нет, обычный stream последовательный, а parallel() — лишь выбор режима pipeline.
Почему side effect в map опасен? Порядок, число и поток вызовов зависят от pipeline и реализации.