java8使用流

   

    这种处理数据的方式很有用,因为你让Stream API管理如何处理数据。这样StreamAPI就可以在背后进行多种优化。此外,使用内部迭代的话,SteamAPI可以决定并行运行你的代码。这要是用外部迭代的话就办不到了,因为你只能用单一线程挨个迭代。在本章中,你将会看到Stream API支持的许多操作。这些操作能让你快速完成复杂的数据查询,如筛选、切片、映射、查找、匹配和归约。接下来,我们会看看一些特殊的流:数值流、来自文件和数组等多种来源的流,最后是无限流。

5.1 筛选和切片

在本节中,我们来看看如何选择流中的元素:用谓词筛选,筛选出各不相同的元素,忽略流中的头几个元素,或将流截短至指定长度。

5.1.1 用谓词筛选

5.1.3截短流

流支持1imit(n)方法,该方法会返回一个不超过给定长度的流。所需的长度作为参数传递给1imit。如果流是有序的,则最多会返回前n个元素。比如,你可以建立一个list,选出热量超过300卡路里的头三道菜:

List<Dish>dishes =men.stream()filter(d->d.getCalories()>300)

limit(3)

collect(toList());

图5-3展示了filter和limit的组合。你可以看到,该方法只选出了符合谓词的头三个元素然后就立即返回了结果。

请注意limit也可以用在无序流上,比如源是一个set。这种情况下,limit的结果不会以任何顺序排列。

5.1.4 跳过元素

流还支持skip(n)方法,返回一个扔掉了前n个元素的流。如果流中元素不足n个,则返回一个空流。请注意,1imit(n)和skip(n)是互补的!例如,下面的代码将跳过超过300卡路里的头两道菜,并返回剩下的。图5-4展示了这个查询。

List<Dish>dishes =menu.stream()

filter(d ->d.getCalories()>300)

.skip(2)

.collect(toList())i

在我们讨论映射操作之前,在测验5.1上试试本节学过的内容吧。

测验5.1:筛选

你将如何利用流来筛选前两个荤菜呢?

答案:你可以把filter和limit复合在一起来解决这个问题,并用collect(toList())将流转换成一个列表。

List<Dish>dishes =menu.stream().filter(d->d.getType()== Dish.Type.MEAT).limit(2)

.collect(toList());

5.2映射

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

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

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

List<String>dishNames =menustream()

.map(Dish::getName )

.collect(toList())i

因为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())i

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

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

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

相关文章

天空之眼的观后感

天空之眼&#xff0c;一部反恐题材的电影。 原名eye in the sky&#xff0c;从一个不一样的视角来讲反恐的故事。 这里不提故事本身&#xff0c;知乎&#xff0c;豆瓣上有很多分享。 最初我是在公司组织的培训交流上看到这部电影的剪辑&#xff0c;当时仅作为培训的开始前的导入…

VMwareWorkstation17.0虚拟机安装Windows2.03

VMwareWorkstation17.0虚拟机安装Windows2.03 第一篇 下载Windows2.03第二篇 配置Windows2.03虚拟机机器环境第三篇 启动Windows2.03系统 第一篇 下载Windows2.03 1.Windows2.0原版软盘下载地址是 暂不提供&#xff0c;后续更新 2.Windows2.03虚拟机镜像下载地址是 Windows2…

STM32物联网(ESP-01S模块及STM32和ESP-01S通信方式介绍)

文章目录 前言一、ESP-01S模块介绍二、STM32和ESP-01S通信方式介绍三、什么是AT指令四、创建基础工程总结 前言 本篇文章我们开始正式进入STM32物联网的专栏&#xff0c;在这个专栏中将会带大家学习使用STM32进行联网&#xff0c;联网模块的话主要就是使用到了ESP-01S WIFI模块…

【深度学习】S2 数学基础 P5 自动微分

目录 自动微分 Autograd一元函数自动微分案例 自动微分 Autograd 深度学习框架&#xff0c;因为存在自动微分技术&#xff0c;可以自动计算梯度&#xff0c;这极大地提升了训练复杂神经网络模型的效率。从而无需繁琐的手动计算&#xff0c;避免错误的发生。 自动微分的核心原…

『运维备忘录』之 Zip 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是&#xff0c;甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作&#xff0c;持续给大家更新运维工作所需要接触到的知识点&#xff0c;希望大…

Java学习22--接口类

接口类的定义和实现 Java接口&#xff08;Interface&#xff09;是Java编程语言中的一个非常重要的概念。它是一个完全抽象的类&#xff0c;用于定义一组方法&#xff0c;这些方法由类来实现。接口定义了一个契约&#xff0c;即规定了类应该具备哪些方法&#xff0c;但并不实现…

WebStorm | 如何修改webstorm中新建html文件默认生成模板中title的初始值

在近期的JS的学习中&#xff0c;使用webstorm&#xff0c;总是要先新建一个html文件&#xff0c;然后再到里面书写<script>标签&#xff0c;真是麻烦&#xff0c;而且标题也是默认的title&#xff0c;想改成文件名还总是需要手动去改 经过小小的研究&#xff0c;找到了修…

单片机学习笔记---LCD1602

LCD1602介绍 LCD1602&#xff08;Liquid Crystal Display&#xff09;液晶显示屏是一种字符型液晶显示模块&#xff0c;可以显示ASCII码的标准字符和其它的一些内置特殊字符&#xff08;比如日文的片假名&#xff09;&#xff0c;还可以有8个自定义字符 显示容量&#xff1a;…

centos7.9 搭建k8s

K3s -轻量级Kubernetes K3s 是轻量级的 Kubernetes。K3s 易于安装&#xff0c;仅需要 Kubernetes 内存的一半&#xff0c;所有组件都在一个小于 100 MB 的二进制文件中。 为什么叫 K3s? 我们希望安装的 Kubernetes 只占用一半的内存。Kubernetes 是一个 10 个字母的单词&am…

【AIGC】Stable Diffusion安装包

Stable Diffusion 的安装教程通常分为以下几个步骤&#xff1a; 一、安装 Python&#xff1a; 确保您的系统中已经安装了 Python&#xff0c;并且版本符合 Stable Diffusion 的要求。通常情况下&#xff0c;Python 版本应为 3.6 或更高版本。您可以从 Python 官方网站下载并安…

AlmaLinux更换鼠标样式为Windows样式

文章目录 前言先看看条件与依赖第一步&#xff1a;测试最终效果第二步&#xff1a;使用CursorXP修改鼠标样式CurosrXP安装CursorXP使用 第三步&#xff1a;Linux端环境搭建与命令执行UbuntuFedora其他系统均失败 第四步&#xff1a;应用主题 前言 只不过是突发奇想&#xff0c…

React:高阶组件|ref转发

高阶组件 参考文档&#xff1a;高阶组件 – React (reactjs.org) 高阶组件&#xff08;Higher-Order Components&#xff0c;简称 HOC&#xff09;是React中用于复用组件逻辑的一种高级技巧。具体而言&#xff1a;高阶组件是参数为组件&#xff0c;返回值为新组件的函数。 组件…

vue3 codemirror yaml文件编辑器插件

需求&#xff1a;前端编写yaml配置文件 &#xff0c;检查yaml语法 提供语法高亮 。 默认内容从后端接口获取 显示在前端 &#xff0c; 前端在codemirror 插件中修改文件内容 &#xff0c;并提交修改 后端将提交的内容写入服务器配置文件中 。 codemirror 通过ref 后期编辑器…

jacob使用教程---环境搭建及基本组成元素

参考资料: jacob的GitHub地址 jacob官网(个人感觉不重要) microsoft官方VBA文档(很重要,jacob所有的参数都来自于这里) jacob找COM组件 jacob环境配置教程 jacob将word转为各种格式 提取word中审阅内容 本人参考例子及相关资料 具有参考价值的博客 jacob操作e…

2024 前端面试题 附录3

这里记录的是昨天和今天原篇的知识点补充 原篇地址&#xff1a; 2024 前端面试题&#xff08;GPT回答 示例代码 解释&#xff09;No.41 - No.60 2024 前端面试题&#xff08;GPT回答 示例代码 解释&#xff09;No.61 - No.100 2024 前端面试题&#xff08;GPT回答 示例代…

【Python】通过conda安装Python的IDE

背景 系统&#xff1a;win11 软件&#xff1a;anaconda Navigator 问题现象&#xff1a;①使用Navigator安装jupyter notebook以及Spyder IDE 一直转圈。②然后进入anaconda prompt执行conda install jupyter notebook一直卡在Solving environment/-\。 类似问题&#xff1a; …

【Java基础题型】逢7过

朋友聚会的时候可能会玩一个游戏&#xff1a;缝7过 游戏规则&#xff1a;从任意一个数字开始报数&#xff0c;当你要报的数字是包含7或者 是7的倍数时&#xff0c;都要说&#xff1a;"过" 需求&#xff1a;使用程序在控制台打印出1-100之间的满足逢七必过规则的数…

计算机网络——12DNS

DNS DNS的必要性 IP地址标识主机、路由器但IP地址不好记忆&#xff0c;不便于人类用使用&#xff08;没有意义&#xff09;人类一般倾向于使用一些有意义的字符串来标识Internet上的设备存在着“字符串”——IP地址的转换的必要性人类用户提供要访问机器的“字符串”名称由DN…

FreeRTOS知识点

1>任务调度算法 1.抢占式调度&#xff1a;高优先级的任务优先执行&#xff0c;并且可以打断低优先级的任务执行。 在FreeRTOSConfig.h中开启configUSE_PREEMPTION宏&#xff0c;将宏设置为1&#xff0c;关闭&#xff08;将宏设置为0&#xff09; 2.时间片轮转&#xff1a…

Python-1

1. 解释Python中的GIL&#xff08;Global Interpreter Lock&#xff09;及其对多线程编程的影响。 Python中的GIL&#xff08;Global Interpreter Lock&#xff09;是一种互斥锁&#xff0c;它确保在CPython解释器中同一时刻只有一个线程执行Python字节码。 GIL的存在对多线程…