一、前言
今天在看java lambda stream的时候,发现2个方法map 和 flatMap 方法很相似,都是遍历集合,返回对象,本着刨根问底的决心,来对比下 这2个方法的相同点和区别。
二、代码理解
1、有一个 list 集合,有5个元素,分别是: [1,2,3,4,5]
ArrayList<Integer> list = Lists.newArrayList(1,2,3,4,5);
2、map方法使用: list集合中,元素统一扩大3倍:
- @Test
- public void mapTest(){
- List
collect = list.stream().map(e -> e * 3).collect(Collectors.toList()); - System.out.println("mapTest collect res :" + collect);
- }
-
2.1、输出结果如下:
mapTest collect res :[3, 6, 9, 12, 15]
3、map方法使用:list集合中,元素赋值到User对象中:
- /**
- * @Description: map 方法转换到对象中
- * @return void
- * @version v1.0
- * @author wu
- * @date 2022/8/17 22:11
- */
- @Test
- public void map3Test(){
- List
collect = list.stream().map(e -> { - User user = new User();
- user.setId(e);
- return user;
- }).collect(Collectors.toList());
-
- System.out.println("map 方法转换到对象中:" + collect);
- }
3.1、输出结果如下:
map 方法转换到对象中:[User{id=1, name='null'}, User{id=2, name='null'}, User{id=3, name='null'}, User{id=4, name='null'}, User{id=5, name='null'}]
4、flatMap方法使用:list集合 和 integers 集合组合
- @Test
- public void flatMapTest(){
- ArrayList
integers = Lists.newArrayList(33, 44, 66); - List
collect = list.stream().flatMap(e -> integers.stream()).collect(Collectors.toList()); - System.out.println(collect);
- }
-
4.1、输出结果如下:(2个循环比遍历交叉 list * integers )
[33, 44, 66, 33, 44, 66, 33, 44, 66, 33, 44, 66, 33, 44, 66]
5、flatMap方法使用:输出每一个单词
- /**
- * @Description: flatMap 用法
- *
遍历 Stream 返回一个新的Stream - * @return void
- * @version v1.0
- * @author wu
- * @date 2022/8/14 21:52
- */
- @Test
- public void flatMapTest2(){
- String words = "hell;word,java;flatMap";
- List
- System.out.println("flatMapTest :" +collect);
- }
-
5.1、输出结果如下:
flatMapTest :[hell, word, java, flatMap]
三、总结
1、相同点: map 和 flatMap 都是遍历集合元素,然后返回处理后的对象;
- // map
- <R> Stream<R> map(Function<? super T, ? extends R> mapper);
-
- // flatMap
- <R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
2、不同点:
(引用 架构悟道 公众号图片 ... )
3、比如: map 返回Stream 类型 (看起来没有意义)
- @Test
- public void mapToStreamTest(){
- List
> collect = list.stream().map(e -> Lists.newArrayList(e).stream()).collect(Collectors.toList()); - List
> collect1 = collect.stream().map(e -> e.collect(Collectors.toList())).collect(Collectors.toList());
- System.out.println("map 返回stream "+ collect1);
- }
-
- // 输出结果: map 返回stream [[1], [2], [3], [4], [5]]
了解更多:
Java8的 Stream的 peek 和 foreach 方法区别 peek和foreach用法_HaHa_Sir的博客-CSDN博客