Назад к вопросам
Middle
76
questionbank

Для чего в 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

Основное назначение этих методов — преобразование каждого элемента потока в ноль или более элементов другого потока и последующее объединение этих потоков в один. Это часто используется для работы с вложенными структурами данных или когда один входной элемент может породить множество выходных.