Java 8 Stream flatMap()
Данная статья написана командой Vertex Academy. Это одна из статей из нашего Учебника по Java 8. Надеемся, что данная статья Вам будет полезна. Приятного прочтения!
В этой статье мы рассмотрим преобразование данных с помощью Stream-ов в Java.
1. Введение
Stream API - новый способ взаимодействия с данными, представляя их в виде конечного потока данных.
Один из методов Stream-ов, flatMap() принимает лямбда-выражение известное как функция (Function), которое "разворачивает" Stream-ы в один.
С ними мы сегодня и научимся работать.
2. Stream flatMap() List
Создадим класс Human
1 2 3 4 5 6 |
class Human { private final String name; private final List<String> pets; //constructors, getters } |
Получим имена питомцев всех людей
До Java 8
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public static void main(String[] args) { List<Human> humans = asList( new Human("Sam", asList("Buddy", "Lucy")), new Human("Bob", asList("Frankie", "Rosie")), new Human("Marta", asList("Simba", "Tilly"))); List<String> petNames = new ArrayList<>(); for (Human human : humans) { petNames.addAll(human.getPets()); } System.out.println(petNames); // output [Buddy, Lucy, Frankie, Rosie, Simba, Tilly] } |
Сейчас мы можем использовать метод flatMap(), передав функцию которая принимает коллекцию а возвращает Stream
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public static void main(String[] args) { List<Human> humans = asList( new Human("Sam", asList("Buddy", "Lucy")), new Human("Bob", asList("Frankie", "Rosie")), new Human("Marta", asList("Simba", "Tilly"))); List<String> petNames = humans.stream() .map(human -> human.getPets()) //преобразовываем Stream<Human> в Stream<List<Pet>> .flatMap(pets -> pets.stream())//"разворачиваем" Stream<List<Pet>> в Stream<Pet> .collect(Collectors.toList()); System.out.println(petNames); // output [Buddy, Lucy, Frankie, Rosie, Simba, Tilly] } |
так же можно использовать сокращенную версию и вместо map + flatMap()
1 2 |
.map(human -> human.getPets()) .flatMap(pets -> pets.stream()) |
использовать
1 |
.flatMap(human -> human.getPets().stream()) |
Финальный вариант
1 2 3 4 5 6 7 8 9 10 11 12 |
public static void main(String[] args) { List<Human> humans = asList( new Human("Sam", asList("Buddy", "Lucy")), new Human("Bob", asList("Frankie", "Rosie")), new Human("Marta", asList("Simba", "Tilly"))); List<String> petNames = humans.stream() .flatMap(human -> human.getPets().stream()) .collect(Collectors.toList()); System.out.println(petNames); // output [Buddy, Lucy, Frankie, Rosie, Simba, Tilly] } |
3. Stream flatMap() primitive array
Преобразуем двумерный массив примитивов в одномерный
До Java 8
1 2 3 4 5 6 7 8 9 10 11 12 |
public static void main(String[] args) { int[][] arr = {{1, 2}, {3, 4}, {5, 6}}; // массив 3 на 2 int[] newArr = new int[arr.length * arr[0].length]; // length = 6 for (int i = 0, index = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { newArr[index++] = arr[i][j]; } } System.out.println(Arrays.toString(newArr)); //output [1, 2, 3, 4, 5, 6] } |
Сейчас
1 2 3 4 5 6 7 8 9 |
public static void main(String[] args) { int[][] arr = {{1, 2}, {3, 4}, {5, 6}}; int[] newArr = Arrays.stream(arr) .flatMapToInt(i -> Arrays.stream(i)) //преобразовываем IntStream<int[]> в IntStream .toArray(); // преобразовываем IntStream в int[] System.out.println(Arrays.toString(newArr)); //output [1, 2, 3, 4, 5, 6] } |
Метод flatMapToInt() принимает функцию которая должна вернуть IntStream. Метод Arrays.toStream() как раз таки превращает массив в IntStream.
Пример так же можно улучшить используя ссылку на метод , заменив
1 |
flatMapToInt(i -> Arrays.stream(i)) |
на
1 |
flatMapToInt(Arrays::stream) |
Финальный вариант
1 2 3 4 5 6 7 8 9 |
public static void main(String[] args) { int[][] arr = {{1, 2}, {3, 4}, {5, 6}}; int[] newArr = Arrays.stream(arr) .flatMapToInt(Arrays::stream) //преобразовываем IntStream<int[]> в IntStream .toArray(); // преобразовываем IntStream в int[] System.out.println(Arrays.toString(newArr)); //output [1, 2, 3, 4, 5, 6] } |
Надеемся, что наша статья была Вам полезна. Также есть возможность записаться на наши курсы по Java в Киеве. Детальнее - у нас на сайте.