Метод 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]
}
}
В этом примере:
- Мы создаем список целых чисел.
- Применяем метод
stream()
для создания потока. - Используем метод
map
, чтобы преобразовать каждое число в его квадрат. - Собираем результаты в новый список с помощью
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]
}
}
В этом примере:
- Мы создаем массив строк.
- Применяем
Arrays.stream(words)
для создания потока. - Используем метод
map
, чтобы преобразовать каждую строку в ее длину. - Применяем
mapToInt
, чтобы преобразоватьStream<Integer>
вIntStream
. - Собираем результаты в массив с помощью
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,