java8 stream流操作的flatMap

我们来详细解释一下 Java 8 Stream API 中的 flatMap 操作。理解 flatMap 的关键在于将其与 map 操作进行对比。

​核心概念:​

  1. map 操作:​

    • 作用:将一个流中的每个元素​​转换​​为另一个元素(类型可以不同)。
    • 输入:一个元素 T
    • 输出:一个元素 R (通过你提供的 Function<T, R> 函数)
    • 结果流:一个包含所有转换后元素 R 的流 Stream<R>
    • ​特点:​​ 输入一个元素,输出一个元素。输入流中有 N 个元素,输出流中也有 N 个元素(类型可能变了)。
  2. flatMap 操作:​

    • 作用:将一个流中的每个元素​​转换​​为​​零个、一个或多个新元素组成的流​​,然后将所有这些生成的流​​“扁平化”​​ 连接成一个单一的流。
    • 输入:一个元素 T
    • 输出:一个流 Stream<R> (通过你提供的 Function<T, Stream<R>> 函数)
    • 结果流:将每个输入元素 T 产生的 Stream<R> 中的所有元素​​连接(展平)​​ 起来形成的最终 Stream<R>
    • ​特点:​
      • 输入一个元素,输出一个​​流​​(包含零个、一个或多个元素)。
      • 然后将所有输出的流“拍扁”,合并成一个单一的流。
      • 输入流中有 N 个元素,输出流中的元素个数可以是 0 到 M(M 是所有生成的流中元素的总和)。元素类型通常也会改变。

​为什么叫 “flatMap”?​

  • ​Map:​​ 因为它像 map 一样,对每个元素应用一个转换函数。
  • ​Flat:​​ 因为它将转换后产生的​​嵌套结构(流中的流)​​ “展平”(flatten)成一个单一的流。

​核心函数式接口:​

  • map 使用 Function<T, R>: R apply(T t)
  • flatMap 使用 Function<T, Stream<R>>: Stream<R> apply(T t) — ​​注意返回值必须是 Stream!​

​常见使用场景:​

  1. ​展平嵌套集合:​​ 这是最经典的用法。

    List<List<String>> nestedList = Arrays.asList(Arrays.asList("a", "b", "c"),Arrays.asList("d", "e"),Arrays.asList("f", "g", "h")
    );// 使用 map: 得到一个包含3个流的流 (Stream<Stream<String>>)
    Stream<Stream<String>> streamOfStreams = nestedList.stream().map(list -> list.stream());// 使用 flatMap: 得到一个包含所有字符串的单一流 (Stream<String>)
    Stream<String> flatStream = nestedList.stream().flatMap(list -> list.stream());List<String> flattenedList = flatStream.collect(Collectors.toList());
    // flattenedList 结果为: ["a", "b", "c", "d", "e", "f", "g", "h"]
  2. 处理可能产生多个结果的元素:​​ 例如,一个字符串数组,你想把每个字符串按空格分割成单词。
    List<String> lines = Arrays.asList("Hello world", "Java 8 Streams", "flatMap example");// 使用 map + split: 得到一个包含字符串数组的流 (Stream<String[]>)
    Stream<String[]> streamOfArrays = lines.stream().map(line -> line.split(" "));// 使用 flatMap + Arrays.stream(): 得到一个包含所有单词的单一流 (Stream<String>)
    Stream<String> wordsStream = lines.stream().flatMap(line -> Arrays.stream(line.split(" ")));List<String> words = wordsStream.collect(Collectors.toList());
    // words 结果为: ["Hello", "world", "Java", "8", "Streams", "flatMap", "example"]

总结 flatMap:​

  • ​目的:​​ 处理那些一个输入元素会映射到​​多个输出元素​​(或者需要表示为流)的场景,并将这些输出​​平滑地合并​​到最终的结果流中。
  • ​关键:​​ 你提供给 flatMap 的函数 (Function<T, Stream<R>>) ​​必须返回一个 Stream 对象​​。
  • ​结果:​​ 将输入流中每个元素产生的所有 Stream<R> 的内容连接起来,形成一个单一的、连续的 Stream<R>
  • ​效果:​​ “展平”嵌套结构或一对多映射。

简单来说,当你遇到类似“我有一个列表,里面的每个元素本身又是一个列表(或其他集合),我想把它们合并成一个大列表”或者“我有一个流,每个元素处理后会得到一组结果,我想把这些结果都收集到一个流里”的情况时,flatMap 就是你的好帮手。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90450.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90450.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源UI生态掘金:从Ant Design二次开发到行业专属组件的技术变现

开源UI生态掘金&#xff1a;从Ant Design二次开发到行业专属组件的技术变现内容摘要在开源UI生态中&#xff0c;Ant Design作为一款广受欢迎的UI框架&#xff0c;为开发者提供了强大的基础组件。然而&#xff0c;面对不同行业的特定需求&#xff0c;仅仅依靠现有的组件往往难以…

Object Sense (OSE):一款从编辑器脚本发展起来的编程语言

引言&#xff1a;从Vim编辑器走出的语言在编程语言的世界里&#xff0c;许多革命性的创新往往源于看似简单的工具。Object Sense&#xff08;简称OSE&#xff09;的诞生&#xff0c;便与一款经典文本编辑器——Vim息息相关。它的前身是Vim的脚本语言VimL&#xff08;Vimscript&…

我考PostgreSQL中级专家证书二三事

1. 为什么选择PGCE&#xff1f;PostgreSQL的开源特性、高性能和高扩展性早已让我心生向往&#xff0c;而PGCE认证不仅是对技术能力的认可&#xff0c;更是一张通往更高职业舞台的“通行证”。官方资料提到&#xff0c;PGCE考试涵盖性能优化、高可用架构、复杂查询处理、内核原理…

Java 动态导出 Word 登记表:多人员、分页、动态表格的最佳实践

本文详细讲解如何使用 Java 动态导出包含多人员报名表的 Word 文档&#xff0c;每人占据独立一页&#xff0c;并支持动态表格行&#xff08;如个人经历&#xff09;。我们对比了多种实现方案&#xff0c;最终推荐基于 Freemarker XML 模板 或 docx4j 的灵活方式&#xff0c;并…

【element-ui el-table】多选表格勾选时默认勾选了全部,row-key绑定异常问题解决

项目场景&#xff1a; Element-UI的el-table组件row-key使用问题 同一个页面使用了几个table&#xff0c;这几个table都使用了多选&#xff0c;row-key属性&#xff0c;其中row-key的绑定方式都是用的静态绑定&#xff0c;row-key“username”或row-key“id”&#xff0c;可正常…

C#注释技巧与基础编程示例

以下是一个包含基础注释的 C# 程序示例&#xff0c;展示了 C# 中各类注释的使用方法&#xff1a;using System;namespace BasicCSharpProgram {/// <summary>/// Program 类是应用程序的入口点/// 包含 Main 方法作为程序执行的起点/// </summary>public class Pro…

极客大挑战2019-HTTP

涵盖知识&#xff1a;UA头伪造漏洞&#xff1a;全称&#xff1a;User-Agent 这个部分包含我们所使用的操作系统版本&#xff0c;cpu&#xff0c;浏览器类型等。来源伪造漏洞&#xff1a;在http请求头中会携带一个Referer&#xff0c;这个用来表示服务器用户是从哪个地方来的X-F…

谈谈ArrayList与Vector的理解?

目录 扩容机制 ArrayList扩容源码 Vector扩容源码 二者区别 扩展&#xff1a;stack(栈&#xff09; 1.创建stack对象 2. 入栈(先进后出&#xff09; 3.出栈 扩展&#xff1a;举个例子&#xff1a;实现下字符串逆置&#xff0c;利用stack栈来实现。 从接口实现上&#xff…

【Linux庖丁解牛】— 多线程同步 !

1. 什么是线程同步为什么会有线程同步&#xff0c;那一定是有了新问题。互斥可以解决临界资源被同时访问的问题&#xff0c;但是纯互斥也会带来新的问题。由于当前被执行的线程离cpu最近【其他线程被阻塞挂起还要被唤醒】&#xff0c;所以&#xff0c;当前进程对于竞争锁天然就…

基于arduino uno r3主控的环境监测系统设计-1

准备设计arduino uno r3为主控的环境监测系统&#xff0c;通过传感器采集TVOC&#xff08;总挥发性有机物&#xff09;、HCHO&#xff08;甲醛&#xff09;和eCO2&#xff08;等效二氧化碳&#xff09;数据&#xff0c;并显示在LCD屏幕上&#xff0c;同时支持数据记录到SD卡&am…

ITIL 4:云计算与微服务对组织架构的影响

这几年&#xff0c;很多组织在推进数字化转型时遇到一个共同的问题&#xff1a;业务节奏越来越快&#xff0c;但内部协作的“架构”却越来越跟不上节奏。技术架构的变革&#xff0c;必须同步推动组织架构的重塑。特别是随着云计算和微服务架构的广泛应用&#xff0c;这种影响愈…

【Android】xml和Java两种方式实现发送邮件页面

三三要成为安卓糕手 一&#xff1a;xml中LinearLayout布局参数的使用 1&#xff1a;xml代码 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http:/…

美林数据用大模型重构电能质量评估,让隐蔽合规问题无所遁形

在“双碳”目标驱动下&#xff0c;电网企业正加速推进数字化转型&#xff0c;电能质量评估作为电力系统安全运行的核心环节&#xff0c;其合规性与效率直接影响着电网智能化水平。然而&#xff0c;传统人工审核模式已难以应对海量报告与复杂标准——单份报告需20-30人天核对、关…

前端基础 JS Vue3 Ajax

一、JSalert( .... ) //弹出框console.log( ....... ) //输出到控制台浏览器JS引入方式&#xff1a;1、内部脚本&#xff1a;将JS代码定义在HTML页面中位于<script></script>标签之间2、外部脚本&#xff1a;将JS代码写在外部JS文件中&#xff0c;在HTML页面中使用…

如何解决pip安装报错ModuleNotFoundError: No module named ‘notebook’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘notebook’问题 一、摘要 在使用 PyCharm 进行 Python 开发时&#xff0c;常常需要通过 pip install 安装第三方包。但有时即便已经安装成功&#xff0c;运行代…

一、Vue概述以及快速入门

什么是VueVue的快速入门代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Vue快速入门</title><script src"js/vue.js"></script> </head> <bod…

模型的存储、加载和部署

定义损失函数并以此训练和评估模型 存储模型可以只存储state_dict或模型参数&#xff0c;每当需要部署经过训练的模型时&#xff0c;创建模型的对象并从文件中加载参数&#xff0c;这是 Pytorch 创建者推荐的方法。 目录 模型的存储、加载 模型的部署 模型的存储、加载 承接…

Java学习第七十部分——微服务架构

目录 一、前言提要 二、核心优势 三、核心技术栈 四、构建步骤 五、困难挑战 六、总结归纳 一、前言提要 Java 微服务架构是一种使用 Java 技术栈构建分布式系统的方法论&#xff0c;它将单一的大型应用程序分解为一组小型、独立、松耦合、可独立部署和扩展的服务。每个服…

六边形滚动机器人cad【7张】三维图+设计书明说

摘 要 机械制造业是国家的重要产业,随着时代的发展,智能化越来越在生活中变得普遍,工业的发展深深的影响着一个国家的经济发展。全球经济的发展带领着机械工业在不断的进步。随着国外先进技术在我国的传播,也影响着我国技术的发展,在全球经济的大环境的推动下,大型四边形…

人形机器人加快先进AI机器人开发

物理AI的新时代通用人形机器人专为快速适应现有的以人类为中心的城市和工业工作空间而构建&#xff0c;用以承担枯燥、重复性或对体力要求高的工作任务。这些机器人正在从工厂车间走向医疗健康机构&#xff0c;通过自动化帮助人类工作&#xff0c;缓解劳动力短缺问题。但是&…