Skip to content

Метод map в Java Stream API

Введение

Java Stream API, введенный в Java 8, предоставляет мощные инструменты для работы с коллекциями и массивами. Одним из ключевых методов в этом API является метод map. В этой лекции мы подробно рассмотрим, что такое метод map, как он работает, и как его можно использовать в различных контекстах.

Что такое метод map?

Метод map — это промежуточный оператор, который позволяет преобразовывать элементы потока. Он принимает функцию (лямбда-выражение или метод), которая применяется к каждому элементу потока, и возвращает новый поток, содержащий результаты применения этой функции.

Синтаксис:

Stream<R> map(Function<? super T, ? extends R> mapper);
  • T — тип элементов исходного потока.
  • R — тип элементов результирующего потока.
  • mapper — функция, которая преобразует элементы типа T в элементы типа R.

Пример использования метода map

Рассмотрим простой пример, где мы имеем список целых чисел, и мы хотим получить новый список, содержащий квадраты этих чисел.

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class MapExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // Применяем метод map для получения квадратов чисел
        List<Integer> squares = numbers.stream()
                .map(n -> n * n) // Преобразуем каждое число в его квадрат
                .collect(Collectors.toList()); // Собираем результат в список

        System.out.println(squares); // Вывод: [1, 4, 9, 16, 25]
    }
}

В этом примере:

  1. Мы создаем список целых чисел.
  2. Применяем метод stream() для создания потока.
  3. Используем метод map, чтобы преобразовать каждое число в его квадрат.
  4. Собираем результаты в новый список с помощью collect(Collectors.toList()).

Применение метода map в контексте массивов

Метод map также можно использовать для работы с массивами. Например, если у нас есть массив строк, и мы хотим получить массив их длин, мы можем сделать это следующим образом:

import java.util.Arrays;

public class MapArrayExample {
    public static void main(String[] args) {
        String[] words = {"Java", "Stream", "API"};

        // Применяем метод map для получения длин слов
        int[] lengths = Arrays.stream(words)
                .map(String::length) // Преобразуем каждую строку в ее длину
                .mapToInt(Integer::intValue) // Преобразуем Stream<Integer> в IntStream
                .toArray(); // Собираем результат в массив

        System.out.println(Arrays.toString(lengths)); // Вывод: [4, 6, 3]
    }
}

В этом примере:

  1. Мы создаем массив строк.
  2. Применяем Arrays.stream(words) для создания потока.
  3. Используем метод map, чтобы преобразовать каждую строку в ее длину.
  4. Применяем mapToInt, чтобы преобразовать Stream<Integer> в IntStream.
  5. Собираем результаты в массив с помощью toArray().

Вложенные потоки и метод map

Метод map может быть использован в сочетании с другими методами, такими как flatMap, для работы с вложенными структурами данных. Например, если у нас есть список списков, и мы хотим получить плоский список всех элементов, мы можем использовать flatMap вместе с map.

```java import java.util.Arrays; import java.util.List; import java.util.stream.Collectors;

public class NestedMapExample { public static void main(String[] args) { List> listOfLists = Arrays.asList( Arrays.asList(1, 2), Arrays.asList(3, 4), Arrays.asList(5, 6) );

    // Применяем flatMap для получения плоского списка
    List<Integer> flatList = listOfLists.stream()
            .flatMap(List::stream) // Разворачиваем вложенные списки
            .map(n -> n * n) // Применяем map для получения квадратов
            .collect(Collectors.toList()); // Собираем результат в список

    System.out.println(flatList); // Вывод: [1, 4, 9, 16, 25,