码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java8的 lambda Stream的 map 和 flatmap 方法区别 map和flatMap方法的用法


            Java8的 lambda Stream的 map 和 flatmap 方法区别 map和flatMap方法的用法

     

    一、前言

            今天在看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倍:

    1. @Test
    2. public void mapTest(){
    3. List collect = list.stream().map(e -> e * 3).collect(Collectors.toList());
    4. System.out.println("mapTest collect res :" + collect);
    5. }

            2.1、输出结果如下:

            mapTest collect res :[3, 6, 9, 12, 15]

            3、map方法使用:list集合中,元素赋值到User对象中:

    1. /**
    2. * @Description: map 方法转换到对象中
    3. * @return void
    4. * @version v1.0
    5. * @author wu
    6. * @date 2022/8/17 22:11
    7. */
    8. @Test
    9. public void map3Test(){
    10. List collect = list.stream().map(e -> {
    11. User user = new User();
    12. user.setId(e);
    13. return user;
    14. }).collect(Collectors.toList());
    15. System.out.println("map 方法转换到对象中:" + collect);
    16. }

            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 集合组合

    1. @Test
    2. public void flatMapTest(){
    3. ArrayList integers = Lists.newArrayList(33, 44, 66);
    4. List collect = list.stream().flatMap(e -> integers.stream()).collect(Collectors.toList());
    5. System.out.println(collect);
    6. }

            4.1、输出结果如下:(2个循环比遍历交叉 list * integers )

    [33, 44, 66, 33, 44, 66, 33, 44, 66, 33, 44, 66, 33, 44, 66]

            

            5、flatMap方法使用:输出每一个单词

    1. /**
    2. * @Description: flatMap 用法
    3. *
      遍历 Stream 返回一个新的Stream
    4. * @return void
    5. * @version v1.0
    6. * @author wu
    7. * @date 2022/8/14 21:52
    8. */
    9. @Test
    10. public void flatMapTest2(){
    11. String words = "hell;word,java;flatMap";
    12. List collect = Arrays.stream(words.split(",")).flatMap(e -> Arrays.stream(e.split(";"))).collect(Collectors.toList());
    13. System.out.println("flatMapTest :" +collect);
    14. }
    15.         5.1、输出结果如下:

      flatMapTest :[hell, word, java, flatMap]

      三、总结

              1、相同点: map 和 flatMap 都是遍历集合元素,然后返回处理后的对象;

      1. // map
      2. <R> Stream<R> map(Function<? super T, ? extends R> mapper);
      3. // flatMap
      4. <R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);

              2、不同点:

      • map 可以返回任何类型的对象 , 而 flatMap 仅限返回 Stream 类型 ;
      • map 必须是 一对一 的,即每个元素都只能转换为1个新的元素
      • flatMap 可以是 一对多 的,即每个元素都可以转换为1个或者多个新的元素
      • flatMap 操作的时候其实是先每个元素处理并返回一个新的Stream,然后将多个Stream展开合并为了一个完整的新的Stream

       (引用 架构悟道 公众号图片 ... )

              3、比如: map 返回Stream 类型 (看起来没有意义)

      1. @Test
      2. public void mapToStreamTest(){
      3. List> collect = list.stream().map(e -> Lists.newArrayList(e).stream()).collect(Collectors.toList());
      4. List> collect1 = collect.stream().map(e -> e.collect(Collectors.toList())).collect(Collectors.toList());
      5. System.out.println("map 返回stream "+ collect1);
      6. }
      7. // 输出结果: map 返回stream [[1], [2], [3], [4], [5]]

      了解更多: 

      Java8的 Stream的 peek 和 foreach 方法区别 peek和foreach用法_HaHa_Sir的博客-CSDN博客

    16. 相关阅读:
      P1013 [NOIP1998 提高组] 进制位
      【CF679B】Bear and Tower of Cubes
      Bracket Sequence ——卡特兰数
      200道Java面试题
      【Python】PySpark 数据处理 ① ( PySpark 简介 | Apache Spark 简介 | Spark 的 Python 语言版本 PySpark | Python 语言场景 )
      力扣(LeetCode)84. 柱状图中最大的矩形 (C++)
      LT6911C是HDMI1.4转双MIPIDSI/CSI带音频
      MTK平台Metadata的加载(3)——其他Static和Request加载
      Discourse 分类图片
      【Matlab】Matlab实现数据的动态显示方法
    17. 原文地址:https://blog.csdn.net/HaHa_Sir/article/details/126395870
      • 最新文章
      • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
        用 Hashids 优雅解决 C 端自增 ID 暴露问题
        V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
        LLVM Pass快速入门(四):代码插桩
        milkup:桌面端 markdown AI续写和即时渲染
        基于项目工程构建SBOM(软件物料清单)的研究
        鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
        .NET 中如何快速实现 List 集合去重?
        扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
        浅谈数据访问层
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      小工具 小游戏
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

      京公网安备 11010502049817号