Java Stream flatMap()

时间:2020-02-23 14:36:53  来源:igfitidea点击:

在将给定函数应用于流的所有元素之后,Java Stream flatMap()是一个非常有用的函数,用于将Stream扁平化。

Java Stream flatMap

让我们看一下Stream flatMap()函数的语法。

<R> Stream<R> flatMap(Function<T, Stream<R>> mapper);

简而言之,当我们有一个集合流并且想要对其进行展平而不是使用map()函数并获取嵌套的Stream时,将使用flatMap()。

让我们看一个例子,以更好地了解这种情况。
假设我们有几个字符串列表:

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

现在我们要合并这些列表,并获得一个新的字符串列表,并将字母更改为大写。
由于我们有多个列表,因此我们必须首先将它们合并到一个列表中,然后再应用map()函数。
类似于以下代码:

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

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

显然,这需要大量的工作,我们必须手动合并列表以获取单个元素列表,然后应用map()函数。
这是flatMap()非常有用的地方。
让我们看看如何使用flatMap()执行相同的操作。

List<String> betterLetters = Stream.of(l1, l2)
				.flatMap(List::stream)
				.map(String::toUpperCase)
				.collect(Collectors.toList());

现在很明显,我们使用了flatMap()函数将列表流转化为元素流。

Java Stream flatMap()实际示例

让我们看一个真实的例子,其中flatMap()函数将非常有用。
假设我们有一个" State"类,其中包含城市列表。
现在我们有了州列表,我们希望获得所有城市的列表。
其中flatMap()将非常有用,因为我们不必编写嵌套的for循环并手动遍历列表。
以下是显示此方案的完整示例。

package com.theitroad.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<State> allStates = Arrays.asList(karnataka, punjab);

		//Java Stream flatMap way
		List<String> allCities = allStates.stream().flatMap(e -> e.getCities().stream()).collect(Collectors.toList());
		
		System.out.println(allCities);
		
		//legacy way
		allCities = new ArrayList<String>();
		for(State state : allStates) {
			for(String city : state.getCities())
				allCities.add(city);
		}
		System.out.println(allCities);
	}

}

class State {
	private List<String> cities = new ArrayList<>();

	public void addCity(String city) {
		cities.add(city);
	}

	public List<String> getCities() {
		return this.cities;
	}
}

很明显,当我们必须使用列表列表时,flatMap()非常有用。