Автор оригинала: Pankaj Kumar.
Java Stream flatMap () – очень полезная функция для выравнивания потока после применения данной функции ко всем элементам потока.
Плоская карта потока Java
Давайте рассмотрим синтаксис функции Stream flatMap ().
Stream flatMap(Function > mapper);
Проще говоря, flatMap() используется, когда у нас есть поток коллекций, и мы хотим выровнять его, а не использовать функцию map()
и получить вложенный поток.
Давайте рассмотрим пример, чтобы лучше понять этот сценарий. Предположим, у нас есть несколько списков строк:
Listl1 = Arrays.asList("a","b"); List l2 = Arrays.asList("c","d");
Теперь мы хотим объединить эти списки, получить новый список строк и изменить буквы на прописные. Поскольку у нас есть несколько списков, нам придется сначала объединить их в один список, а затем применить функцию map (). Что-то вроде кода ниже:
Listl = new ArrayList<>(); l.addAll(l1); l.addAll(l2); List letters = l.stream() .map(String::toUpperCase) .collect(Collectors.toList());
Очевидно, что это большая переделка, и мы должны вручную объединить списки, чтобы получить единый список элементов, а затем применить функцию map (). Вот где flatMap()
очень полезен. Давайте посмотрим, как мы можем использовать flatMap() для выполнения той же операции.
ListbetterLetters = Stream.of(l1, l2) .flatMap(List::stream) .map(String::toUpperCase) .collect(Collectors.toList());
Теперь ясно, что мы использовали функцию flatMap() для выравнивания Потока списков в поток элементов.
Java Stream flatMap() Пример из Реальной Жизни
Давайте рассмотрим пример из реальной жизни, где функция flatMap() будет действительно полезна. Предположим, у нас есть класс State
, содержащий список городов. Теперь у нас есть список штатов, и мы хотим получить список всех городов. Здесь flatMap() будет очень полезен, так как нам не придется писать вложенные циклы for и перебирать списки вручную. Ниже приведен полный пример, показывающий этот сценарий.
package com.journaldev.streams; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class JavaStreamFlatMapAggregateExample { public static void main(String[] args) { State karnataka = new State(); karnataka.addCity("Bangalore"); karnataka.addCity("Mysore"); State punjab = new State(); punjab.addCity("Chandigarh"); punjab.addCity("Ludhiana"); ListallStates = Arrays.asList(karnataka, punjab); //Java Stream flatMap way List allCities = allStates.stream().flatMap(e -> e.getCities().stream()).collect(Collectors.toList()); System.out.println(allCities); //legacy way allCities = new ArrayList (); for(State state : allStates) { for(String city : state.getCities()) allCities.add(city); } System.out.println(allCities); } } class State { private List cities = new ArrayList<>(); public void addCity(String city) { cities.add(city); } public List getCities() { return this.cities; } }
Совершенно очевидно, что flatMap() очень полезен, когда нам приходится работать со списком списков.
Ссылка: API Doc