关于Java8中map()和flatMap()的一些事
两个方法的背景
这两个方法看起来做着同样的事情,但实际上又有些不一样。看源码部分是这样的
packagejava.util.stream;
map()方法
/** *@paramTheelementtypeofthenewstream *@parammappera non-interfering, * stateless *functiontoapplytoeachelement *@returnthenewstream */ Stream map(Functionmapper);
flatMap()方法
/** *@paramTheelementtypeofthenewstream *@parammappera non-interfering, * stateless *functiontoapplytoeachelementwhichproducesastream *ofnewvalues *@returnthenewstream */ Stream flatMap(Function>mapper);
Streammap()Method
看源码做推测,map是一种中间操作,返回的是Stream
代码测试
map()方法
publicstaticvoidmain(String[]args){ System.out.println("Outputwithsimplelist"); Listvowels=Arrays.asList("A","E","I","O","U"); vowels.stream().map(vowel->vowel.toLowerCase()) .forEach(value->System.out.println(value)); List haiList=newArrayList<>(); haiList.add("hello"); haiList.add("hai"); haiList.add("hehe"); haiList.add("hi"); System.out.println("OutputwithnestedListofList "); List welcomeList=newArrayList<>(); welcomeList.add("Yougotit"); welcomeList.add("Don'tmentionit"); welcomeList.add("Noworries."); welcomeList.add("Notaproblem"); List >nestedList=Arrays.asList(haiList,welcomeList); nestedList.stream().map(list->{ returnlist.stream().map(value->value.toUpperCase()); }).forEach(value->System.out.println(value)); }
Output
Outputwithsimplelist a e i o u OutputwithnestedListofListjava.util.stream.ReferencePipeline$3@3b9a45b3 java.util.stream.ReferencePipeline$3@7699a589
flatMap()方法
publicstaticvoidmain(String[]args){ ListhaiList=newArrayList<>(); haiList.add("hello"); haiList.add("hai"); haiList.add("hehe"); haiList.add("hi"); System.out.println("OutputwithnestedListofList "); List welcomeList=newArrayList<>(); welcomeList.add("Yougotit"); welcomeList.add("Don'tmentionit"); welcomeList.add("Noworries."); welcomeList.add("Notaproblem"); List >nestedList=Arrays.asList(haiList,welcomeList); nestedList.stream().flatMap( list->list.stream()) .map(value->value.toUpperCase()) .forEach(value->System.out.println(value)); }
Output
OutputwithnestedListofListHELLO HAI HEHE HI YOUGOTIT DON'TMENTIONIT NOWORRIES. NOTAPROBLEM
Java8map()vsflatMap()
- map()和flatMap()方法都可以应用于Stream
和Optional 。并且都返回Stream 或Optional。 - 区别在于,映射操作为每个输入值生成一个输出值,而flatMap操作为每个输入值生成任意数量(零个或多个)的值。在flatMap()中,每个输入始终是一个集合,可以是List或Set或Map。映射操作采用一个函数,该函数将为输入流中的每个值调用,并生成一个结果值,该结果值将发送到输出流。flatMap操作采用的功能在概念上想消耗一个值并产生任意数量的值。但是,在Java中,方法返回任意数量的值很麻烦,因为方法只能返回零或一个值。
代码
publicstaticvoidmain(String[]args){ Listtogether=Stream.of(Arrays.asList(1,2),Arrays.asList(3,4))//StreamofList .map(List::stream) .collect(Collectors.toList()); System.out.println("Outputwithmap()->"+together); List togetherFlatMap=Stream.of(Arrays.asList(1,2),Arrays.asList(3,4))//StreamofList .flatMap(List::stream) .map(integer->integer+1) .collect(Collectors.toList()); System.out.println("OutputwithflatMap()->"+togetherFlatMap); }
Output
Outputwithmap()->[java.util.stream.ReferencePipeline$Head@16b98e56,java.util.stream.ReferencePipeline$Head@7ef20235] OutputwithflatMap()->[2,3,4,5]
总结
到此这篇关于关于Java8中map()和flatMap()的文章就介绍到这了,更多相关Java8中map()和flatMap()内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!