← Назад к вопросам

Что на выходе в flatMap()

2.0 Middle🔥 31 комментариев
#Docker, Kubernetes и DevOps

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

flatMap() в Stream API — что получается на выходе

flatMap() — это операция Stream API, которая преобразует каждый элемент потока в новый поток, а затем объединяет (flatten) все эти потоки в один. На выходе получается один объединённый поток со всеми элементами.

Основная идея

Представьте, что вы имеете список списков. flatMap развернёт их в один большой список:

// Есть список списков чисел
List<List<Integer>> listOfLists = Arrays.asList(
    Arrays.asList(1, 2, 3),
    Arrays.asList(4, 5),
    Arrays.asList(6, 7, 8, 9)
);

// map() просто пройдёт по каждому внутреннему списку (не развернёт их)
listOfLists.stream()
    .map(list -> list.stream())
    .forEach(System.out::println);
// Результат: три строки (Stream objects), а не числа

// flatMap() развернёт всё в один поток
List<Integer> allNumbers = listOfLists.stream()
    .flatMap(list -> list.stream())
    .collect(Collectors.toList());

System.out.println(allNumbers); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

Синтаксис и сигнатура

// Сигнатура flatMap
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);

// T — тип элемента текущего потока
// R — тип элементов в новом потоке
// mapper — функция, которая преобразует T в Stream<R>

Визуализация процесса

Исходный поток:           [1, 2, 3]
                ↓ flatMap
Каждый элемент → Stream:  [1] → Stream(1, 1, 1)
                           [2] → Stream(2, 2, 2)
                           [3] → Stream(3, 3, 3)
                ↓ flatten
Результат:                [1, 1, 1, 2, 2, 2, 3, 3, 3]

Практические примеры

1. Развёртывание вложенных структур

List<String> words = Arrays.asList(
    "привет",
    "мир",
    "java"
);

// Получить все уникальные буквы из всех слов
List<String> uniqueLetters = words.stream()
    .flatMap(word -> word.split("") <response clipped><NOTE>response clipped - capped at 8000 chars</NOTE>