Рубрики
Без рубрики

Плоская карта потока Java()

Плоская карта Java Stream, карта Java Stream против плоской карты, список списков Java Stream flatten, карта Java 8 flatMap против карты, вложенный список Java Stream, список списков Java 8 flatMap.

Автор оригинала: Pankaj Kumar.

Java Stream flatMap () – очень полезная функция для выравнивания потока после применения данной функции ко всем элементам потока.

Плоская карта потока Java

Давайте рассмотрим синтаксис функции Stream flatMap ().

 Stream flatMap(Function> mapper);

Проще говоря, flatMap() используется, когда у нас есть поток коллекций, и мы хотим выровнять его, а не использовать функцию map() и получить вложенный поток.

Давайте рассмотрим пример, чтобы лучше понять этот сценарий. Предположим, у нас есть несколько списков строк:

List l1 = Arrays.asList("a","b");
List l2 = Arrays.asList("c","d");

Теперь мы хотим объединить эти списки, получить новый список строк и изменить буквы на прописные. Поскольку у нас есть несколько списков, нам придется сначала объединить их в один список, а затем применить функцию map (). Что-то вроде кода ниже:

List l = new ArrayList<>();
l.addAll(l1);
l.addAll(l2);

List letters = l.stream()
			.map(String::toUpperCase)
			.collect(Collectors.toList());

Очевидно, что это большая переделка, и мы должны вручную объединить списки, чтобы получить единый список элементов, а затем применить функцию map (). Вот где flatMap() очень полезен. Давайте посмотрим, как мы можем использовать flatMap() для выполнения той же операции.

List betterLetters = 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");

		List allStates = 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