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()非常有用。