Для чего в Stream API предназначены методы flatMap(), flatMapToInt(), flatMapToDouble() и flatMapToLong()?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Методы flatMap(), flatMapToInt(), flatMapToDouble() и flatMapToLong() в Stream API используются для сглаживания потоков. Они преобразуют каждый элемент входного потока в ноль или более элементов другого потока, а затем объединяют эти полученные потоки в один результирующий плоский поток.
Основные отличия:
flatMap(): Принимает функцию, которая возвращаетStream<R>, и объединяет эти потоки в одинStream<R>.flatMapToInt(): Принимает функцию, которая возвращаетIntStream, и объединяет эти потоки в одинIntStream.flatMapToDouble(): Принимает функцию, которая возвращаетDoubleStream, и объединяет эти потоки в одинDoubleStream.flatMapToLong(): Принимает функцию, которая возвращаетLongStream, и объединяет эти потоки в одинLongStream.
Пример использования flatMap():
// Исходный список списков строк
List<List<String>> nestedList = Arrays.asList(
Arrays.asList("one", "two"),
Arrays.asList("three", "four"),
Arrays.asList("five")
);
// Используем flatMap для сглаживания в один поток строк
List<String> flatList = nestedList.stream()
.flatMap(Collection::stream) // Каждый внутренний список преобразуется в поток, а затем все объединяются
.collect(Collectors.toList());
// Результат flatList будет ["one", "two", "three", "four", "five"]
Пример использования flatMapToInt():
// Исходный список списков целых чисел
List<List<Integer>> nestedInts = Arrays.asList(
Arrays.asList(1, 2),
Arrays.asList(3),
Arrays.asList(4, 5, 6)
);
// Используем flatMapToInt для сглаживания в один IntStream
int sumOfAll = nestedInts.stream()
.flatMapToInt(list -> list.stream().mapToInt(Integer::intValue)) // Преобразуем List<Integer> в IntStream
.sum(); // Суммируем все элементы в IntStream
// Результат sumOfAll будет 21
Таблица сравнения:
| Метод | Входная функция возвращает | Результирующий поток |
|---|---|---|
flatMap() |
Stream<R> |
Stream<R> |
flatMapToInt() |
IntStream |
IntStream |
flatMapToDouble() |
DoubleStream |
DoubleStream |
flatMapToLong() |
LongStream |
LongStream |
Основное назначение этих методов — преобразование каждого элемента потока в ноль или более элементов другого потока и последующее объединение этих потоков в один. Это часто используется для работы с вложенными структурами данных или когда один входной элемент может породить множество выходных.