Java8实战-总结19

news2024/11/17 13:30:27

Java8实战-总结19

  • 使用流
    • 映射
      • 对流中每一个元素应用函数
      • 流的扁平化

使用流

映射

一个非常常见的数据处理套路就是从某些对象中选择信息。比如在SQL里,你可以从表中选择一列。Stream API也通过mapflatMap方法提供了类似的工具。

对流中每一个元素应用函数

流支持map方法,它会接受一个函数作为参数。这个函数会被应用到每个元素上,并将其映射成一个新的元素(使用映射一词,是因为它和转换类似,但其中的细微差别在于它是“创建一个新版本”而不是去“修改”)。例如,下面的代码把方法引用Dish::getName传给了map方法,来提取流中菜肴的名称:

List<String> dishNames = menu.stream()
				.map(Dish::getName)
				.collect(toList());

因为getName方法返回一个String,所以map方法输出的流的类型就是Stream<String>。看一个稍微不同的例子来巩固一下对map的理解。给定一个单词列表,想要返回另一个列表,显示每个单词中有几个字母。怎么做呢?需要对列表中的每个元素应用一个函数。这听起来正好该用map方法去做!应用的函数应该接受一个单词,并返回其长度。你可以像下面这样,给map传递一个方法引用String::length来解决这个问题:

List<String> words = Arrays.asList("Java 8","Lambdas","In","Action");
List<Integer> wordLengths = words.stream()
							.map(String::length)
							.collect(toList());

现在让我们回到提取菜名的例子。如果要找出每道菜的名称有多长,怎么做?你可以像下面这样,再链接上一个map:

List<Integer> dishNameLengths = menu.stream()
									.map(Dish::getName)
									.map(String::length)
									.collect(toList());

流的扁平化

已经看到如何使用map方法返回列表中每个单词的长度了。拓展一下:对于一张单词表,如何返回一张列表,列出里面各不相同的字符呢?例如,给定单词列表["Hello","World"],返回列表["H","e","1","o","W","r","d"]

你可能会认为这很容易,你可以把每个单词映射成一张字符表,然后调用distinct来过滤
重复的字符。第一个版本可能是这样的:

		words.stream()
			.map(word -> word.split(""))
			.distinct()
			.collect(toList());

这个方法的问题在于,传递给map方法的Lambda为每个单词返回了一个string[](String列表)。因此,map返回的流实际上是Stream<String[]>类型的。你真正想要的是用Stream<String>来表示一个字符流。下图说明了这个问题。
在这里插入图片描述
幸好可以用flatMap来解决这个问题!让我们一步步看看怎么解决它。

  1. 尝试使用mapArrays.stream()

首先,你需要一个字符流,而不是数组流。有一个叫作Arrays.stream()的方法可以接受一个数组并产生一个流,例如:

String[] arrayOfWords ={"Goodbye", "World"};
Stream<String> streamofwords = Arrays.stream(arrayOfWords);

把它用在前面的那个流水线里,看看会发生什么:
将每个单词转换为由

		words.stream()
				.map(word -> word.split()//将每个单词转换为由其字母构成的数组
				.map(Arrays::stream)//让每个数组变成一个单独的流
				.distinct()
				.collect(toList());

当前的解决方案仍然搞不定!这是因为,你现在得到的是一个流的列表(更准确地说是Stream<String>)!的确,你先是把每个单词转换成一个字母数组,然后把每个数组变成了一个独立的流。

2.使用flatMap

你可以像下面这样使用flatMap来解决这个问题:

List<String> uniqueCharacters =words.stream()
						.map(w -> w.split(""))//将每个单词转换为由其字母构成的数组
						.flatMap(Arrays::stream)//将各个生成流扁平化为单个流
						.distinct()
						.collect(Collectors.toList());

使用flatMap方法的效果是,各个数组并不是分别映射成一个流,而是映射成流的内容。所有使用map(Arrays::stream)时生成的单个流都被合并起来,即扁平化为一个流。下图说明了使用flatMap方法的效果。
在这里插入图片描述
一言以蔽之,flatmap方法让你把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流。

测验:映射
(1)给定一个数字列表,如何返回一个由每个数的平方构成的列表呢?例如,给定[1,2,3,4,5],应该返回[1,4,9,16,25]。

答案:你可以利用map方法的Lambda,接受一个数字,并返回该数字平方的Lambda来解决这个问题。
	List<Integer> numbers = Arrays.asList(1,2,3,4,5);
	List<Integer> squares =numbers.stream()
					.map(n ->n * n)
					.collect(toList());
(2)给定两个数字列表,如何返回所有的数对呢?例如,给定列表[1,2,3]和列表[3,4],应该返回[(1,3),(1,4),(2,3),(2,4),(3,3),(3,4)]。为简单起见,可以用有两个
元素的数组来代表数对。

答案:你可以使用两个map来迭代这两个列表,并生成数对。但这样会返回一个Stream-<Stream<Integer[]>>。你需要让生成的流扁平化,以得到一个Stream<Integer[]>。这正是flatMap所做的:
	List<Integer> numbers1 = Arrays.asList(1,2,3);
	List<Integer> numbers2 = Arrays.asList(3, 4);
	List<int[]> pairs =
	numbers1.stream()
					.flatMap( i -> numbers2.stream()
							.map( j -> new int[]{i,j})
					)
					.collect(toList());
				
(3)如何扩展前一个例子,只返回总和能被3整除的数对呢?例如(2,4)和(3,3)是可以的。答案:你在前面看到了,filter可以配合谓词使用来筛选流中的元素。
因为在flatMap操作后,你有了一个代表数对的int[]流,所以你只需要一个谓词来检查总和是否能被3整除就可以了:

	List<Integer> numbers1 = Arrays.asList(1, 2,3);
	List<Integer> numbers2 = Arrays.asList(3, 4);
	List<int[]> pairs =
	numbers1.stream()
				.flatMap(i ->
						numbers2.stream()
							.filter(j ->(i+j) % 3== 0)
						.map(j -> new int[]{i,j})
		)
	.collect(toList());
其结果是[(2,4),(3,3)]。

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

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

相关文章

回归预测 | MATLAB实现PCA-BP主成分降维结合BP神经网络多输入单输出回归预测

回归预测 | MATLAB实现PCA-BP主成分降维结合BP神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现PCA-BP主成分降维结合BP神经网络多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现PCA-BP主成分降维算法结合BP神经网络多输入单输出回…

java八股文面试[设计模式]——行为型模式

目录 策略模式 观察者模式 责任链模式 模板方法模式 状态模式 行为型模式关注的是各个类之间的相互作用&#xff0c;将职责划分清楚&#xff0c;使得我们的代码更加地清晰。 策略模式 策略模式太常用了 下面设计的场景是&#xff0c;我们需要画一个图形&#xff0c;可选…

leetcode872. 叶子相似的树(java)

叶子相似的树 题目描述递归 题目描述 难度 - 简单 leetcode - 872. 叶子相似的树 请考虑一棵二叉树上所有的叶子&#xff0c;这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。 举个例子&#xff0c;如上图所示&#xff0c;给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。 如果…

cuda显存访问耗时

背景&#xff1a; 项目中有个数据量大小为5195 * 512 * 128float 1.268G的显存&#xff0c;发现有个函数调用很耗时&#xff0c;函数里面就是对这个显存进行128个元素求和&#xff0c;得到一个5195 * 512的图像 分析 1. 为什么耗时 直观上感觉这个流程应该不怎么耗时才对&a…

TDengine 官网换了新“皮肤”,来看看这个风格是不是你的菜

改版升级&#xff0c;不同以“网”&#xff01;为了更好地服务客户&#xff0c;让大家能够更便捷、清晰地了解我们的产品和功能&#xff0c;我们决定给 TDengine 官网换个新“皮肤”~精心筹备下&#xff0c;新官网终于成功与大家见面啦——https://www.taosdata.com/。TDengine…

《向量数据库指南》——AI原生向量数据库Milvus Cloud 2.3稳定性

在当今的互联网时代,稳定性是所有系统和应用程序的关键要素。无论是大型数据中心还是个人电脑,稳定性都是保证正常运行和用户体验的基础。在这个背景下,我们来谈谈 Milvus,一个开源的向量数据库,它在 2.1.0 版本中引入了内存多副本的概念。 Milvus 是一个开源的向量数据库…

9:00面试,9:08就出来了,问的实在有点变态

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降30%,…

osgEarth::ElevationQuery的setMaxTilesToCache函数的作用

【引子】 osgEarth::ElevationQuery类用于查询高程&#xff0c;自测效率比较低&#xff08;大概每个点需要四五十毫秒&#xff09;&#xff0c;成员函数setMaxTilesToCache(int)&#xff0c;之前看说明仍然不是很确认其具体的意义&#xff0c;想尝试设置是否能加速下。 看之前的…

MATLAB实现TopSis优劣解距离法——分析《世界征服者3》将领排名

问题背景 世界征服者3游戏中有150的将领角色&#xff0c;每个将领都有自己的兵种优势、军阶、技能等不同的属性&#xff0c;如何教务客观、综合全面地选拔出其中排名前50的将领&#xff1f;基于TOPSIS优劣解距离法以及聚类算法&#xff0c;给出大家较为客观的排名。 一.问题描…

使用树莓派搭建个人网站,并发布到外网可访问:实用步骤解析

文章目录 前言使用 Raspberry Pi Imager 安装 Raspberry Pi OS测试 web 站点安装静态样例站点 将web站点发布到公网安装 Cpolarcpolar进行token认证生成cpolar随机域名网址生成cpolar二级子域名将参数保存到cpolar配置文件中测试修改后配置文件配置cpolar服务开机自启动 前言 …

Day_81-87 CNN卷积神经网络

目录 一. CNN卷积神经网络与传统神经网络的不同 1. 模型图 2. 参数分布情况 3. 卷积神经网络和传统神经网络的层次结构 4. 传统神经网络的缺点&#xff1a; 二. CNN的基本操作 1. 卷积 2. 池化 三. CNN实现过程 1. 算法流程图 2. 输入层 3. 卷积层 4. 激活层 5. 池化层 6. 全连…

LINE自动回复:快速回复提升客服效率

2023年&#xff0c;LINE在其4个主要市场&#xff1a;对话、日本、台湾和泰国拥有约1.78亿月活跃用户。 LINE不仅是一个通讯软件&#xff0c;更提供广泛的服务&#xff0c;包括语音和视讯通话、群组、发布社交帖子及商务功能。近年来&#xff0c;越来越多的企业在客户服务中使用…

搭建花店小程序商城的详细步骤

首先&#xff0c;你需要找一个专业成熟的小程序商城制作平台。一个优秀的小程序商城制作平台应该具备丰富的行业模板、简便的设计工具和强大的功能模块。在这里&#xff0c;我们推荐乔拓云平台&#xff0c;其后台管理页面友好&#xff0c;设计搭建页面功能齐全&#xff0c;且针…

画流程图大家都用哪些工具?

流程图工具是一个用于创建图表和图形功能的应用程序。这些流程图工具允许团队成员在绘图软件上合作&#xff0c;制作的流程图可以提供清晰的视觉效果、即时沟通、有效的协调和有效的分析&#xff0c;从而提高设计的工作效率。下面将推荐6个流程图工具&#xff0c;我相信总有一个…

C高级第2天

写一个1.sh脚本&#xff0c;将以下内容放到脚本中&#xff1a; 在家目录下创建目录文件&#xff0c;dir 在dir下创建dir1和dir2 把当前目录下的所有文件拷贝到dir1中&#xff0c; 把当前目录下的所有脚本文件拷贝到dir2中 把dir2打包并压缩为dir2.tar.xz 再把dir2.tar.xz…

Vue的props配置项

简介&#xff1a;Vue中的组件模板是可以复用的&#xff0c;但是模板中的数据是可以改变的。props配置项用于解决组件迁移复用时接受和保存传递给组件的数据的问题。 1.如何给组件传递数据&#xff1f; 答&#xff1a;按照key:value的形式进行传递。 2.如何保存传递给组件的数…

Vulnhub: Masashi: 1靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.236 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.236查看80端口的robots.txt提示三个文件 snmpwalk.txt内容&#xff0c;tftp服务在1337端口 sshfolder.txt内容&#xff0c…

鞋店小程序商城开发指南

网站制作教程分享&#xff01;新手也能学会的鞋店自建网站教程 在开发鞋店小程序商城时&#xff0c;您可以按照以下步骤进行操作&#xff1a; 1. 浏览器搜索【乔拓云】注册登录账号进入操作后台&#xff0c;找到并点击【商城】中的【去管理】进入商城的后台管理页面。接着&…

ABAP BP维护客户cl_md_bp_maintain=>maintain

ps_head结构如下 下面是封装好的form示例 *&---------------------------------------------------------------------* *& Form frm_modify_customer *&---------------------------------------------------------------------* *& text *&--------…

异步编程 - 07 基于JDK中的Future实现异步编程(下)_当Stream遇见CompletableFuture

文章目录 JDK8 StreamStream遇见CompletableFuture小结 JDK8 Stream JDK8中提供了流式对数据进行处理的功能&#xff0c;它的出现允许我们以声明式方式对数据集合进行处理。所谓声明式是相对于我们平时所用的命令式编程来说的&#xff0c;使用声明式编程会让我们对业务的表达更…