lambda 中 map 和 flatMap 的区别

news/2024/11/21 0:28:22/文章来源:https://www.cnblogs.com/kelelipeng/p/18345731

lambda 中 map 和 flatMap 的区别

 https://blog.csdn.net/weixin_52772307/article/details/128944511

 

总结:
当我们需要将具有层级结构的数据展平时,也就是将多层数据转换为单层数据操作时,我们可以使用 flatMap 方法。如果我们只是简单的对流中的数据计算或者转换时,可以使用 map 方法。举例:
① 使用 flatMap:[a,b,c,d,[e,f [g,h,i]]] 转换为 [a,b,c,d,e,f,g,h,i]
② 使用 map: [1,2,3,4,5,6] 转换为 [11,12,13,14,15,16]
③ 使用 map: [a,b,c] 转换为 [A,B,C] 

 

 

 

一、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);
可以看到,不论是 map 还是 flatMap 方法,都是对以流的形式数据的处理,返回值同样都是流形式数据的泛型。本质一样,都是 map 操作,但是不同点在于,flatMap 操作会比 map 多一个 flat 操作。
"flat"单词本意有平的、扁平的含义,在源码中,我们对于 flatMap 方法中 API Note 有这样一句话:
"The flatMap() operation has the effect of applying a one-to-many transformation to the elements of the stream, and then flattening the resulting elements into a new stream."
含义是:flatMap()操作的效果是对流的元素应用一对多转换,然后将生成的元素展平为新的流。
而map方法的返回是:返回由将给定函数应用于此流元素的结果组成的流。说到这里可能还是会有些不太清晰,我们用代码演示一下。

 

 

二、代码演示
① 两个类,一个 Library 类,一个 Book 类

@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class Library {private String name;private List<Book> book;
}@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class Book {private String name;private String author;private Integer price;
}

 

② 测试类

public class StreamTest {public static void main(String[] args) {System.out.println("---------->存储的图书信息: ");System.out.println(initInfo());System.out.println("---------->测试map方法:");testMap();System.out.println("---------->测试flatMap方法:");testFlatMap();}private static void testMap() {initInfo().stream().map(library -> library.getBook()).forEach(book -> System.out.println(book));}private static void testFlatMap() {initInfo().stream().flatMap(library -> library.getBook().stream()).forEach(book -> System.out.println(book));}public static List<Library> initInfo() {Library library1 = new Library("新华图书", null);Library library2 = new Library("大家图书", null);Library library3 = new Library("瀚海图书", null);Book book1 = new Book("西游记", "吴承恩", 49);Book book2 = new Book("水浒传", "施耐庵", 57);Book book3 = new Book("三国演义", "罗贯中", 52);Book book4 = new Book("朝花夕拾", "鲁迅", 30);List<Book> library1Book = new ArrayList<>();List<Book> library2Book = new ArrayList<>();List<Book> library3Book = new ArrayList<>();library1Book.add(book1);library1Book.add(book2);library2Book.add(book2);library2Book.add(book3);library3Book.add(book3);library3Book.add(book4);library1.setBook(library1Book);library2.setBook(library2Book);library3.setBook(library3Book);return new ArrayList<>(Arrays.asList(library1, library2, library3));}
}

 

 
③ 测试结果

我们可以看到利用 flatMap 方法后,流中的数据被展平,消除了List<Book>的层级解构,但是 map 中的数据仍然存在层级结构。

map 方法流的中间过程 

 

flatMap 方法流的中间过程 

 可以清楚的看到,map 方法应用后是存在层级结构的,返回的流是List<Book>组成的流,而 flatMap 中消除了List<Book>的层级结构,返回的流是 Book 组成的流。 

 

总结:
当我们需要将具有层级结构的数据展平时,也就是将多层数据转换为单层数据操作时,我们可以使用 flatMap 方法。如果我们只是简单的对流中的数据计算或者转换时,可以使用 map 方法。

举例:
① 使用 flatMap:[a,b,c,d,[e,f [g,h,i]]] 转换为 [a,b,c,d,e,f,g,h,i]
② 使用 map: [1,2,3,4,5,6] 转换为 [11,12,13,14,15,16]
③ 使用 map: [a,b,c] 转换为 [A,B,C]

 

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

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

相关文章

python 音频处理(2)——提取PPG特征之whisper库的使用(2.1)

PPG特征 提取PPG特征 whisper库使用提取PPG特征之——whisper库的使用(2.1) 1 安装对应的包方法一(自用): 直接pip即可: pip install openai-whisper 成功后如下图所示方法二: 当时用了他这个方法环境直接崩了,已老实conda install -c conda-forge ffmpeg conda insta…

数字量输入模块:远程组态说明

XD系列插片式远程 I/O模块是兴达易控技术研发的分布式扩展模块。XD系列成套系统主要由耦合器、各种功能I/O模块、电源辅助模块以及终端模块组成。有多种通讯协议总线的耦合器,例如 PROFINET、EtherCAT、Ethernet/IP、Cclink IE以及modbus/TCP等。I/O 模块可分为多通道数字量输…

Rust_learn_1

变量与可变性 变量 声明变量使用let关键字,在默认情况下,变量是不可变的(Immutable)。为此解决该问题,声明变量时在前面加上 mut,就可以使变量可变常量 常量(constant),在绑定值之后也是不可变的,但是与不可变的变量有很多区别:不可以使用mut,常量永远是不变的声明常…

【python海龟画图】代码整理

春联点击查看代码 import turtle t = turtle t.showturtle() t.penup() t.goto(-150,150) t.pendown()t.color(black, red) t.begin_fill() for i in range(2):t.forward(50)t.right(90)t.forward(400)t.right(90) t.end_fill()t.penup() t.goto(100, 150) t.pendown()t.begin…

【验证码逆向专栏】某安登录流程详解与验证码逆向分析与识别

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术…

Excel 根据单元格值设置行颜色

开始》条件格式》管理规则》新建格式规则》使用公式确定要设置格式的单元格 只为满足以下条件的单元格设置格式:=SEARCH("进行中",$E5)>0 ;(注释:此处筛选的是包含进行中的数据) 格式:选择满足条件的单元格设置什么格式 对某个单元格设置后【此示例使用的是…

怎么将回滚操作

点击禁用双击 install

RAG技术要点及英智未来的应用实践

RAG是检索增强生成(Retrieval-augmented Generation),概念是在2020年发表的论文《面向知识密集型NLP任务的检索增强生成》中提出的。 LLM的工作原理是基于预训练的历史数据进行推理生成文本,所以LLM在生成回答的时候可能会引入了过期的、不可预测的或者错误的信息,导致大语…

2024暑假集训测试18

前言比赛链接。这次有大量外校人员参加,\(90\) 来个人,T1 胡了个结论上去结果大小样例都过了,造 hack 还没 hack 了,索性交了,但是有捆绑感觉会爆零,没想到结论是对的,直接 A 了;打完 T1 就罚坐了,三个小时就弄出来 \(5\) 分,当时都绝望了,想到了很多东西。因为感觉…

智能加速计算卡设计原理图:628-基于VU3P的双路100G光纤加速计算卡 XCVU3P板卡

基于VU3P的双路100G光纤加速计算卡 一、板卡概述 基于Xilinx UltraScale+16 nm VU3P芯片方案基础上研发的一款双口100 G FPGA光纤以太网PCI-Express v3.0 x16智能加速计算卡,该智能卡拥有高吞吐量、低延时的网络处理能力以及辅助CPU进行网络功能卸载的能力,达到最大…

《数据资产管理核心技术与应用》读书笔记-第二章:元数据的采集与存储

《数据资产管理核心技术与应用》是清华大学出版社出版的一本图书,全书共分10章,第1章主要让读者认识数据资产,了解数据资产相关的基础概念,以及数据资产的发展情况。第2~8章主要介绍大数据时代数据资产管理所涉及的核心技术,内容包括元数据的采集与存储、数据血缘、数据质…