码农知识堂 - 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. 相关阅读:
      linux 安装 mini conda,linux下安装 Miniconda
      深度学习之自监督模型汇总
      CSS 滚动驱动动画与 @keyframes 新语法
      SpringCloud微服务-SpringAMQP(RabbitMQ)
      2023最新SSM计算机毕业设计选题大全(附源码+LW)之java小区宠物信息管理系统0v9l2
      【PMP】发起人
      浅谈 volatile
      实用调试技巧
      JavaEE开发之Spring框架整合1
      openStack核心组件的工作流程
    17. 原文地址:https://blog.csdn.net/HaHa_Sir/article/details/126395870
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号