Чем map, flatMap и filter отличаются в Stream API?
map — один элемент → один элемент (преобразование). flatMap — один элемент → поток элементов, все потоки разворачиваются в один. filter — оставляет элементы, удовлетворяющие условию.
- map(User::email): Stream<User> → Stream<String>
- flatMap(u -> u.roles().stream()): Stream<User> → Stream<Role>
- Java 16: mapMulti — альтернатива flatMap без создания промежуточных стримов
А ещё Та же пара map/flatMap есть у Optional и CompletableFuture (thenApply/thenCompose)
Подробно
List<String> emails = users.stream()
.filter(User::isActive) // Stream<User>, только активные
.map(User::email) // Stream<String>
.toList();
Set<Role> roles = users.stream()
.flatMap(u -> u.roles().stream()) // Stream<Role> из всех списков
.collect(Collectors.toSet());
Если в втором примере взять map, получится Stream<Stream<Role>> — поток потоков, с которым неудобно работать.
Частые применения flatMap: развернуть вложенные коллекции, разбить строки на слова (lines.flatMap(l -> Arrays.stream(l.split(" ")))), отбросить пустые Optional (.flatMap(Optional::stream)).
Порядок: filter стоит ставить раньше дорогого map — элементы проходят конвейер по одному, и отброшенные не будут преобразованы зря.
Что хотят услышать
- Различие трёх операций с типами.
- Пример flatMap для вложенных коллекций.
Частые ошибки
- Получить Stream<Stream<T>> там, где нужен flatMap.
- Делать побочные эффекты внутри map/filter.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓map — один в один, flatMap — один в поток и разворачивает их в один, filter — отбирает по условию
- ✗flatMap сортирует элементы, map преобразует, filter удаляет дубликаты
- ✗map и flatMap одинаковы, flatMap просто работает параллельно
- ✗filter преобразует элементы, map отбирает
Что спросят дальше
- Почему stream операции ленивые?
- Чем collect отличается от reduce?
Разбор темы
- Stream API: устройство и ленивый конвейер
Что такое стрим, источники, промежуточные против терминальных, ленивость и short-circuiting, stateful-операции, параллельность и примитивные стримы.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.