接口定义
map:
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
flatMap:
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
通过接口定义可以看出,区别主要有以下两点:
- map 的mapper 每个输入项产生单个值,flatMap 的mapper 每个输入项产生一个流。
- map 接口会把多个值组成一个流,flatMap 会把多个流合并成一个流(扁平化)。
flatMap 用例
用例1:
// Java program using flatMap() function
import java.io.*;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
class GFG {
public static void main(String[] args)
{
// making the arraylist object of List of Integer
List<List<Integer> > number = new ArrayList<>();
// adding the elements to number arraylist
number.add(Arrays.asList(1, 2));
number.add(Arrays.asList(3, 4));
number.add(Arrays.asList(5, 6));
number.add(Arrays.asList(7, 8));
System.out.println("List of list-" + number);
// using flatmap() to flatten this list
List<Integer> flatList
= number.stream()
.flatMap(list -> list.stream())
.collect(Collectors.toList());
// printing the list
System.out.println("List generate by flatMap-"
+ flatList);
}
}
用例2:
String[] words = new String[]{"Hello","World"};
List<String> a = Arrays.stream(words)
.map(word -> word.split(""))
.flatMap(Arrays::stream)
.distinct()
.collect(toList());
a.forEach(System.out::print);