Ответ
Операция flatMap используется в Java Stream API для преобразования каждого элемента потока в новый поток (Stream), а затем «склеивания» (выравнивания) всех этих потоков в один результирующий поток. Это необходимо, когда одно входное значение может соответствовать нулю, одному или нескольким выходным значениям.
Типичные сценарии использования:
-
Преобразование вложенных коллекций в плоский список.
List<List<String>> nestedLists = List.of( List.of("a", "b", "c"), List.of("d", "e") ); List<String> flatList = nestedLists.stream() .flatMap(List::stream) // Преобразуем каждый List в Stream<String> .collect(Collectors.toList()); // Результат: ["a", "b", "c", "d", "e"] -
Разделение элемента на несколько. Например, разбиение строки на слова.
List<String> words = List.of("Hello World", "Java Streams"); List<String> individualWords = words.stream() .flatMap(line -> Arrays.stream(line.split(" "))) // Stream<String> для каждой строки .collect(Collectors.toList()); // ["Hello", "World", "Java", "Streams"] -
Фильтрация
Optionalзначений.flatMapудобен для цепочки операций, возвращающихOptional, избегая вложенныхif.Optional<String> result = Optional.of("value") .flatMap(v -> Optional.of(v.toUpperCase())) // Преобразует Optional<String> в Optional<String> .flatMap(v -> v.isEmpty() ? Optional.empty() : Optional.of(v)); -
Реактивное программирование. Аналогичная операция
flatMapиспользуется в проекте Reactor и RxJava для асинхронной обработки потоков данных, где каждый элемент может запускать асинхронную операцию.