浅谈Java8新特性之Stream--Map和FlatMap的区别

Eg:将Stream集合中的语句进行单词拆分,然后去重StreamtestStream= Stream.of("hello welcome","world hello","hello world","hello world welcome");

map方法是将指定的Stream中元素进行“平级”处理,每个元素转化为各自所对应的一个Stream集合,输入与输出是一对一的关系,若进一步获取各个子Stream中的元素,还需要逐个遍历子集合

得到的Stream中的元素与原Stream中的元素是“父子关系”


Eg:将下面String Stream中的字符串通过空格Split获取单次,并对所有单词去重

StreamtestStream= Stream.of("hello welcome","world hello","hello world","hello world welcome");

(1)通过Map方法:testStream.map(str-> Arrays.stream(str.split(" ")))

得到的将是四个数组:

java.util.stream.ReferencePipeline$Head@816f27d

java.util.stream.ReferencePipeline$Head@87aac27

java.util.stream.ReferencePipeline$Head@3e3abc88

java.util.stream.ReferencePipeline$Head@6ce253f1

(2)第一个总的集合List

    ListtotalList=newArrayList();

(3)要遍历切割完成数组里的所有的单词,需要再逐个遍历其中数组,将所有子集合中的元素合并到一个集合中,也就是要进行切割并获取所有单词的总集合,需要对Map需要进行两层遍历:

testStream.map(str-> Arrays.stream(str.split(" "))).forEach(strStream->strStream.forEach(s->totalList.add(s)));

(4)再次遍历totalList

totalList.stream().distinct().forEach(System.out::println);


flatMap将原有Stream中的元素进行转化为新的子Stream集合,同时对子Stream中的元素进行“跨级”处理,原有的Stream通过一次flatMap之后得到的不是各个子Stream的集合,

而是各个子Steam集合中的元素的总集合,也就是对各个子Stream结合进行二次遍历取出中的元素,融合到一个总集合中

得到的Stream中的元素与原Stream中的元素是“祖孙关系”


Eg:将下面String Stream中的字符串通过空格Split获取单次,并对所有单词去重

StreamtestStream= Stream.of("hello welcome","world hello","hello world","hello world welcome");

(1)通过flatMap方法:testStream.flatMap(str-> Arrays.stream(str.split(" ")))

得到的将是一堆单词的集合:直接将各个子Stream中的元素flat到一起,所有的元素拥有同一个“祖父”

Stream【hello,welcome,world,hello,hello,world,hello,world,welcome】

(2)直接对新得到的Stream去重即可

testStream.flatMap(str-> Arrays.stream(str.split(" "))).distinct().forEach(System.out::println);

你可能感兴趣的:(浅谈Java8新特性之Stream--Map和FlatMap的区别)