map 和 flatMap 都是對流對象進(jìn)行處理妓忍,轉(zhuǎn)換成另一個流對象,但是使用場景有區(qū)別愧旦。
map:元素一對一轉(zhuǎn)換世剖,使用傳入的Function對象,對Stream中的所有元素進(jìn)行處理笤虫,返回的Stream對象中的元素為原元素處理后的結(jié)果旁瘫;
注意是只有一個數(shù)組
flatMap:元素一對多轉(zhuǎn)換,使用傳入的Function對象琼蚯,對原Stream中的所有元素進(jìn)行操作酬凳,每個元素會有一個或者多個結(jié)果,然后將返回的所有元素組合成一個統(tǒng)一的Stream并返回遭庶。
所以宁仔,對簡單的list進(jìn)行處理,可以用map,但是如果數(shù)據(jù)結(jié)構(gòu)復(fù)雜峦睡,list嵌套list的情況下翎苫,我們還想對每個list 中的元素進(jìn)行處理,有些時候map 做不到,就需要用flatMap赐俗。
比如數(shù)據(jù)結(jié)構(gòu)類似這樣:
List<Map<String, List<Student>>>
注意是多個數(shù)組
public static void main(String[] args) {
List<String> list = Arrays.asList("tom", "jame", "jerry", "hello");
List<String[]> collect = list.stream().map(s -> s.split("")).collect(Collectors.toList());
System.out.println(collect);
List<String> list2 = Arrays.asList("tom", "jame", "jerry", "hello");
List<String> collect2 = list2.stream().map(s -> s.split("")).flatMap(s -> Arrays.stream(s)).collect(Collectors.toList());
System.out.println(collect2);
}
結(jié)果如下:
[[Ljava.lang.String;@65ae6ba4, [Ljava.lang.String;@48cf768c, [Ljava.lang.String;@59f95c5d, [Ljava.lang.String;@5ccd43c2]
[t, o, m, j, a, m, e, j, e, r, r, y, h, e, l, l, o]