Stream流中的Map与flatMap的区别及说明

 更新时间:2025年09月19日 15:23:48   作者:night_gu  
Map转换单个元素为新值,保持流长度;flatMap将元素转换为流再合并,实现扁平化处理,两者区别在于返回类型(对象vs流)及是否改变元素数量,适用于不同数据结构转换场景

Map与flatMap的基本概念

Map用于将流中的每个元素通过指定函数转换为另一个元素,生成一个一对一映射的新流。

例如将字符串流转换为对应长度流:

List<String> words = Arrays.asList("a", "bb", "ccc");
List<Integer> lengths = words.stream()
                             .map(String::length)
                             .collect(Collectors.toList()); 
// 输出: [1, 2, 3]

flatMap用于将每个元素转换为流后合并所有流,形成一对多映射的扁平化结果。

例如拆分字符串中的单词:

List<String> lines = Arrays.asList("hello world", "java stream");
List<String> words = lines.stream()
                          .flatMap(line -> Arrays.stream(line.split(" ")))
                          .collect(Collectors.toList());
// 输出: ["hello", "world", "java", "stream"]

核心区别对比

  • 输入输出关系

Map保持原始流元素数量不变,flatMap可能改变元素数量(如拆分为多个子流后合并)

  • 返回值要求

Map的Function返回普通对象,flatMap的Function必须返回Stream对象

  • 数据结构处理

Map适合单一元素转换,flatMap适合处理嵌套集合(如List<List>)

典型应用场景

Map适用场景

数据类型转换(String→Integer)、属性提取(对象→ID)、简单计算(数值→平方值)

flatMap适用场景

  • 合并多个集合:List<List<Integer>> → List<Integer>
  • 分解复合结构:字符串句子→单词流、树节点→子树节点流
  • 过滤后展开操作:先filter再flatMap处理有效数据

性能注意事项

flatMap涉及流合并操作,可能产生更多临时对象。

对于简单转换优先使用map,多层嵌套数据结构才使用flatMap。

代码示例对比

处理书籍作者场景:

// 使用map(保留嵌套结构)
List<Book> books = ...;
List<List<String>> authors = books.stream()
                                 .map(Book::getAuthors)
                                 .collect(Collectors.toList());

// 使用flatMap(扁平化结构)
List<String> allAuthors = books.stream()
                              .flatMap(book -> book.getAuthors().stream())
                              .collect(Collectors.toList());

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java和matlab画多边形闭合折线图示例讲解

    java和matlab画多边形闭合折线图示例讲解

    由于要将“哈密顿回路问题(TSP)”的求解中间结果表示出来,查了一下使用程序画多边形图形。现在在总结一下,这个图是“由给定节点首尾相连的”闭合多边形
    2014-02-02
  • 一些java二进制的相关基础知识

    一些java二进制的相关基础知识

    这篇文章主要介绍了一些java二进制的相关基础知识,在Java语言中byte代表最小计量单位,byte由8位2进制数组成。,需要的朋友可以参考下
    2019-06-06
  • Java反射入门、原理与使用方法详解

    Java反射入门、原理与使用方法详解

    这篇文章主要介绍了Java反射入门、原理与使用方法,结合实例形式详细分析了java反射的概念、原理、使用方法与相关操作注意事项,需要的朋友可以参考下
    2015-07-07
  • SpringBoot整合Redis的示例

    SpringBoot整合Redis的示例

    这篇文章主要介绍了SpringBoot整合Redis的示例,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下
    2020-10-10
  • Java设计模式--代理模式

    Java设计模式--代理模式

    代理就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用
    2021-07-07
  • 详细学习Java Cookie技术(用户登录、浏览、访问权限)

    详细学习Java Cookie技术(用户登录、浏览、访问权限)

    这篇文章主要为大家详细介绍了Java Cookie技术,显示用户上次登录的时间、显示用户最近浏览的若干个图片(按比例缩放)等,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • mybatis plus常用注解的具体使用

    mybatis plus常用注解的具体使用

    本文主要介绍了mybatis plus常用注解的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Java中实现Comparator接口和用法实例(简明易懂)

    Java中实现Comparator接口和用法实例(简明易懂)

    这篇文章主要介绍了Java中实现Comparator接口和用法实例(简明易懂),本文给出实现Comparator接口的实例和使用这个接口的代码实例,需要的朋友可以参考下
    2015-05-05
  • 在SpringBoot中整合数据源的示例详解

    在SpringBoot中整合数据源的示例详解

    这篇文章主要介绍了在SpringBoot中如何整合数据源,本文介绍了如何在SpringBoot项目中整合常见的数据源,包括JdbcTemplate、MyBatis和JPA,并探讨了如何配置和使用多数据源,需要的朋友可以参考下
    2023-06-06
  • SWT(JFace) 打印功能

    SWT(JFace) 打印功能

    SWT(JFace)体验之打印功能
    2009-06-06

最新评论