Java Stream flatMap()示例
Stream flatMap(Function mapper) 返回一个流,该流由将此流的每个元素替换为对每个元素应用所提供的映射函数而产生的映射流的内容的结果组成。Stream flatMap(Function mapper)是一个 中间操作 这些操作始终是懒惰的。中间操作在一个Stream实例上被调用,在它们完成处理后,它们给出一个Stream实例作为输出:
注意: 每个映射的流在其内容被放入该流后被关闭。如果一个映射的流是空的,就会使用一个空的流来代替。
flatMap() V/s map() :
1) map()接收一个流并将其转换为另一个流。它在Stream的每个元素上应用一个函数,并将返回值存入新的Stream中。它不对流进行平移。但flatMap()是map和flat操作的结合,即它对元素应用一个函数,并对它们进行平坦化处理。
2) map()只用于转换,但flatMap()既用于转换也用于平坦化。
语法:
<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)
其中,R是新流的元素类型。
流是一个接口,T是流元素的类型。
流元素的类型。Mapper是一个无状态函数
它被应用于每个元素,该函数
返回新的流。
例子1: flatMap()函数与提供的映射函数。
// Java code for Stream flatMap
// (Function mapper) to get a stream by
// replacing the stream with a mapped
// stream by applying the provided mapping function.
import java.util.*;
import java.util.stream.Stream;
class GFG {
// Driver code
public static void main(String[] args)
{
// Creating a List of Strings
List<String> list = Arrays.asList("5.6", "7.4", "4",
"1", "2.3");
// Using Stream flatMap(Function mapper)
list.stream().flatMap(num -> Stream.of(num)).
forEach(System.out::println);
}
}
输出:
5.6
7.4
4
1
2.3
例2: flatMap()函数提供了对位置为2的字符串的映射操作。
// Java code for Stream flatMap
// (Function mapper) to get a stream by
// replacing the stream with a mapped
// stream by applying the provided mapping function.
import java.util.*;
import java.util.stream.Stream;
class GFG {
// Driver code
public static void main(String[] args)
{
// Creating a List of Strings
List<String> list = Arrays.asList("Geeks", "GFG",
"GeeksforGeeks", "gfg");
// Using Stream flatMap(Function mapper)
list.stream().flatMap(str ->
Stream.of(str.charAt(2))).
forEach(System.out::println);
}
}
输出:
e
G
e
g
flatMap()是如何工作的?
在帖子中已经讨论过,flatMap()是map和flat操作的结合,也就是说,它首先应用map函数,然后对结果进行扁平化。让我们看一些例子来了解什么是扁平化流。
例子1:
扁平化前的列表。
[ [2, 3, 5], [7, 11, 13], [17, 19, 23] ]
该列表有2个层次,由3个小列表组成。经过扁平化处理,它被转化为 “单层 “结构,如图所示。
[ 2, 3, 5, 7, 11, 13, 17, 19, 23 ]
例2:
扁平化前的列表。
[ ["G", "E", "E"], ["K", "S", "F"], ["O", "R", "G"], ["E", "E", "K", "S"] ]
该列表有3个层次,由4个小列表组成。经过扁平化处理,它被转化为 “单层 “结构,如图所示。
["G", "E", "E", "K", "S", "F", "O", "R", "G", "E", "E", "K", "S"]
简而言之,我们可以说,如果在扁平化之前有一个 < <数据类型>> **的List流 **,那么在应用flatMap()时,扁平化之后会返回 < <数据类型>> **的Stream **。
应用。
// Java code for Stream flatMap(Function mapper)
import java.util.*;
import java.util.stream.Collectors;
class GFG
{
// Driver code
public static void main(String[] args)
{
// Creating a list of Prime Numbers
List<Integer> PrimeNumbers = Arrays.asList(5, 7, 11,13);
// Creating a list of Odd Numbers
List<Integer> OddNumbers = Arrays.asList(1, 3, 5);
// Creating a list of Even Numbers
List<Integer> EvenNumbers = Arrays.asList(2, 4, 6, 8);
List<List<Integer>> listOfListofInts =
Arrays.asList(PrimeNumbers, OddNumbers, EvenNumbers);
System.out.println("The Structure before flattening is : " +
listOfListofInts);
// Using flatMap for transformating and flattening.
List<Integer> listofInts = listOfListofInts.stream()
.flatMap(list -> list.stream())
.collect(Collectors.toList());
System.out.println("The Structure after flattening is : " +
listofInts);
}
}
输出:
The Structure before flattening is : [[5, 7, 11, 13], [1, 3, 5], [2, 4, 6, 8]]
The Structure after flattening is : [5, 7, 11, 13, 1, 3, 5, 2, 4, 6, 8]