使用Java 8 Lambda,流和聚合

总览

在本文中,我们将介绍使用Java 8 lambda,流和聚合来过滤和操作Collection中的对象。 这篇文章中的所有代码都可以在BitBucket中找到 。

在此示例中,我们将创建许多对象,这些对象代表我们IT基础架构中的服务器。 我们将这些对象添加到列表中,然后使用lambda,流和聚合根据某些条件从列表中检索服务器。

目标

  1. 介绍lambda,流和聚合操作的概念。
  2. 解释流和管道之间的关系。
  3. 比较和对比聚合操作和迭代器。
  4. 演示过滤器,collect,forEach,mapToLong,average和getAsDouble聚合操作。

Lambdas

Lambda是Java的新功能,它使我们能够将功能或行为作为参数传递给方法。 一个说明Lambda有用性的示例来自UI编码。 当用户单击用户界面上的按钮时,通常会导致应用程序中发生某些操作。 在这种情况下,我们确实希望将行为传递给onClick(…)方法,以便应用程序将在单击按钮时执行给定的行为。 在Java的早期版本中,我们通过将匿名内部类(实现了已知接口)传递给方法来实现此目的。 在这种情况下使用的接口通常仅包含一个方法,该方法定义了我们希望传递给onClick(…)方法的行为。 尽管这可行,但语法不方便。 匿名内部类仍可用于此目的,但是新的Lambda语法更加简洁。

综合运营

当我们使用Collections将对象存储在程序中时,通常需要做的不仅仅是简单地将对象放入集合中-我们需要存储,检索,删除和更新这些对象。 聚合操作使用lambda对集合中的对象执行操作。 例如,您可以使用聚合操作来:

  • 打印来自特定制造商的库存中所有服务器的名称
  • 返回早于特定使用期限的库存中的所有服务器
  • 计算并返回清单中服务器的平均使用期限(前提是“服务器”对象具有“购买日期”字段)

所有这些任务都可以通过使用聚合操作以及管道和流来完成。 我们将在下面看到这些操作的示例。

管道和流

流水线只是一系列聚合操作。 流是一个项目序列,而不是数据结构,它通过管道从源头承载项目。 管道由以下部分组成:

  1. 数据源。 最常见的是,这是一个Collection,但它可能是一个数组,方法调用的返回结果或某种I / O通道。
  2. 零个或多个中间操作。 例如,过滤操作。 中间操作产生新的流。 过滤器操作接收流,然后产生另一个流,该流仅包含与过滤器条件匹配的项目。
  3. 终端操作。 终端操作返回非流结果。 此结果可能是原始类型(例如,整数),Collection或根本没有结果(例如,该操作可能只是打印流中每个项目的名称)。

一些聚合操作(例如forEach)看起来像迭代器,但是它们有根本的区别:

  1. 聚合操作使用内部迭代。 您的应用程序无法控制元素的处理方式或时间(没有next()方法)。
  2. 聚合操作从流而不是直接从集合处理项目。
  3. 聚合操作支持Lambda表达式作为参数。

Lambda语法

现在,我们已经讨论了与Lambda表达式有关的概念,现在该看看它们的语法了。 您可以将Lambda表达式视为匿名方法,因为它们没有名称。 Lambda语法包含以下内容:

  • 用括号括起来的形式参数的逗号分隔列表。 Lambda表达式中可以省略参数的数据类型。 如果只有一个形式参数,则可以省略括号。
  • 箭头标记:->
  • 由单个表达式或代码块组成的主体。

使用Lambda,流和聚合操作

如概述中所述,我们将通过过滤和检索List中的Server对象来演示lambda,流和聚合的用法。 我们来看四个例子:

  1. 查找并打印来自特定制造商的所有服务器的名称。
  2. 查找并打印超过一定年限的所有服务器的名称。
  3. 查找并提取新的列表到一定年限内的所有服务器,然后在新列表中打印服务器的名称。
  4. 计算并显示列表中服务器的平均寿命。

让我们开始吧…

服务器类

首先,我们来看一下Server类。 Server类将跟踪以下内容:

  1. 服务器名称
  2. 服务器的IP地址
  3. 制造商
  4. 内存容量(GB)
  5. 处理器数量
  6. 购买日期(LocalDate)

请注意(第65行),我们添加了getServerAge()方法,该方法根据购买日期计算服务器的getServerAge()以年为单位)–在计算服务器中平均服务器的寿命时,将使用此方法库存。

Screen-Shot-2015-12-09-at-9.57.1​​7-AM

创建和加载服务器

现在我们有了Server类,我们将创建一个List并加载几台服务器:

Screen-Shot-2015-12-10-at-10.17.47-AM

示例1:打印所有戴尔服务器的名称

对于第一个示例,我们将编写一些代码来查找Dell制造的所有服务器,然后将服务器名称打印到控制台:

Screen-Shot-2015-12-10-at-10.29.48-AM

我们的第一步在第76行–我们必须从服务器列表中获取流。 一旦有了流,就在第77行添加过滤器中间操作。过滤器操作将服务器流作为输入,然后生成另一个服务器流,其中仅包含与过滤器lambda中指定的条件匹配的服务器。 我们仅使用以下lambda选择Dell制造的服务器: s -> s.getManufacturer().equalsIgnoreCase(manufacturer)

变量s代表从流中处理的每个服务器(请记住,我们不必声明类型)。 箭头运算符的右侧表示我们要为每个处理的服务器评估的语句。 在这种情况下,如果当前服务器的制造商是Dell,我们将返回true,否则返回false。 过滤器产生的输出流仅包含Dell制造的那些服务器。

最后,我们在第78行上添加了forEach终端操作。forEach操作将服务器流作为输入,然后在该流中的每个服务器上运行给定的lambda。 我们使用以下lambda将Dell服务器的名称打印到控制台: server -> System.out.println(server.getName())

请注意,我们在第一个lambda中使用s作为流中每个服务器的变量名称,在第二个lambda中使用server作为变量名称-它们不必从一个lambda匹配到下一个lambda。

上面代码的输出是我们期望的:

Screen-Shot-2015-12-10-at-11.08.38-AM

示例2:打印所有超过三年的所有服务器的名称

我们的第二个示例与第一个示例相似,不同之处在于我们要查找3年以上的服务器:

Screen-Shot-2015-12-10-at-10.45.33-AM

此示例与第一个示例之间的唯一区别是,我们将过滤器操作(第89行)中的lambda表达式更改为: s -> s.getServerAge() > age

该过滤器的输出流仅包含3年以上的服务器。

上面代码的输出是:

Screen-Shot-2015-12-10-at-11.25.27-AM

示例3:将所有超过3年的服务器提取到新列表中

我们的第三个示例与第二个示例相似,因为我们正在寻找使用三年以上的服务器。 本示例中的区别在于,我们将创建一个仅包含满足我们条件的服务器的新列表:

Screen-Shot-2015-12-10-at-10.47.36-AM

与前面的示例一样,我们从列表中获取流,并添加过滤器中间操作以创建仅包含3年以上服务器的流(第102和103行)。 现在,在第104行,我们使用collect终端操作而不是forEach终端操作。 收集终端操作将服务器流作为输入,然后将它们放入参数中指定的数据结构中。 在我们的例子中,我们将流转换为服务器列表。 结果列表由第100行上声明的oldServers变量引用。

最后,为了说明在本示例中获得的服务器与上一个服务器相同,我们在oldServers列表中打印所有服务器的名称。 请注意,因为我们希望列表中的所有服务器,所以没有中间过滤器操作。 我们仅从oldServers获取流,并将其提供给forEach终端操作。

输出是我们期望的:

Screen-Shot-2015-12-10-at-12.13.44-PM

示例4:计算并打印服务器的平均寿命

在最后一个示例中,我们将计算服务器的平均寿命:

Screen-Shot-2015-12-10-at-10.50.02-AM

第一步与前面的示例相同–我们从服务器列表中获取流。 接下来,我们添加mapToLong中间操作。 此聚合操作将服务器流作为输入,并产生Longs流作为输出。 根据第119行上指定的lambda将服务器映射到Longs(您也可以在第120行上使用等效语法)。 在这种情况下,我们要抓住每个传入服务器的年龄并将其放入生成的Longs流中。

接下来,我们添加平均终端操作。 平均值完全符合您的期望-计算流中所有值的平均值。 诸如平均值之类的终端操作通过对流的内容进行合并或操作来返回一个值,这被称为归约操作 。 归约运算的其他示例包括summinmaxcount

最后,我们添加操作getAsDouble 。 这是必需的,因为average返回类型OptionalDouble 。 如果传入流为空,则average返回OptionalDouble的空实例。 如果发生这种情况,则调用getAsDouble将抛出NoSuchElementException ,否则它将仅在OptionalDouble实例中返回Double值。

该示例的输出为:

Screen-Shot-2015-12-10-at-10.35.24-PM

结论

我们仅涉及到您可以使用lambda,流和聚合进行的表面处理。 我鼓励您抓住源代码,使用它,并开始探索这些Java 8新功能的所有可能性。

翻译自: https://www.javacodegeeks.com/2015/12/using-java-8-lambdas-streams-aggregates.html

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

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

相关文章

易语言微凉模块oracle,跟着微凉学易语言 【简单子类化】

本帖最后由 【微凉清风】 于 2011-1-20 18:23 编辑易语言的子类化文章太少了,本人文笔也不好哈,看看VB得吧,别说英文看不懂,看不懂你的易语言水平永远不会提高!一,初识子类当你还不碰过子类的时候,你看到这个标题,定会问:"啥叫子类?".因为你知道我定会为你解答.(阴险…

node服务的监控预警系统架构

需求背景 目前node端的服务逐渐成熟,在不少公司内部也开始承担业务处理或者视图渲染工作。不同于个人开发的简单服务器,企业级的node服务要求更为苛刻: 高稳定性、高可靠性、鲁棒性以及直观的监控和报警 想象下一个存在安全隐患且没有监控预警…

jaxb util_JAXB自定义绑定– Java.util.Date / Spring 3序列化

jaxb utilJaxB可以处理Java.util.Date序列化,但是需要以下格式: “ yyyy-MM-ddTHH:mm:ss ”。 如果需要将日期对象格式化为另一种格式怎么办? 我有同样的问题时,我正在同春MVC 3和Jackson JSON处理器 &…

oracle数据库没有选项,创建oracle数据库时,出现ORA-00922: 选项缺失或无效

sdd53HOME新建oracle数据库时遇到ORA-00922: 选项缺失或无效的问题,如图:原因:一般是语句的语法有问题。比如命名不对,关键字写错等等。对于非标准的命名,一般采用双引号来创建。具体原因:就是开始的用户密…

oracle 导出 cuow,直通伍伦贡大学的升学保障— 伍伦贡大学学院(UOWC)

伍伦贡大学学院是直属大学的桥梁课程提供者,为没有达到直入本科的学生提供另一种进入大学的途径,也为大学提供语言类课程。自1989年成立以来,为大学输送了数以千计的优秀学生。目前学院有来自世界30多个国家超过2000名在校生。在伍伦贡大学学…

async 和 await 的进阶

异常的捕获: static void Main(string[] args){//继续我们的异步编程的使用嘀呀;//关于主线程是无法捕获我们子线程中的异常滴滴啊;var t DoExceptionAsync();t.Wait();Console.WriteLine($"{nameof(t.Status)}: {t.Status}"); …

Spark Shell的简单使用

简介 Spark shell是一个特别适合快速开发Spark原型程序的工具,可以帮助我们熟悉Scala语言。即使你对Scala不熟悉,仍然可以使用这个工具。Spark shell使得用户可以和Spark集群交互,提交查询,这便于调试,也便于初学者使用…

w10系统自带linux系统,win10下,内置linux系统的安装和体验,你造吗?

原标题:win10下,内置linux系统的安装和体验,你造吗?众所周知,windows系统和linux系统一直是水火不容,而在最新的win10系统却完美兼容了linux系统,但是在默认情况下是关闭的,需要我们…

北风网09.接收普通消息2

该公众号暂时无法提供服务,请稍后再试 转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/6273960.html

中科软测试面试题2019_2019国考成绩今日是否会发布,笔试120能进面不?

2019国考成绩要出来了不?2019国考成绩何时出来?现在已是1月中旬,许多考生对于自己的国考笔试成绩都非常期待,而最近风声四起,搞得考生们人心慌慌,那么2019国考成绩要出来了不?现在我们一起来分析…

C# 数据库连接测试以及备份

现在我们要做一个如图5.1的数据库连接配置,从界面上看有三个功能需要实现:从配置文件中读取数据库连接的相关属性、备份数据库、测试连接。 现在我们就一个一个开始讲解。 图5.1 1.从配置文件中读取数据库连接的相关属性 1) 配置文件中的数据库连接: &l…

Linux程序选择boy糊者girl,linux脚本程序练习-Go语言中文社区

1、编写一个名为iffile程序,它执行时判断/bin目录下date文件是否存在?2、编写一个名为greet的问候程序,执行时能根据系统当前的时间向用户输出问候信息。设从半夜到中午为早晨,中午到下午六点为下午,下午六点到半夜为晚…

什么是初效过滤器_初效过滤器怎么样 初效过滤器特点介绍【详解】

说起过滤器,我们大家都不陌生。现在环境污染严重,我们大多数家庭都在使用 净水器 、 空气净化器 等家电设备,它们需要依靠过滤器来净化水质和空气,让我们的生活更加健康。不过,您知道初效过滤器安装的步骤是什么吗?下…

云计算hcie贴吧_专业介绍|计算机网络技术

点击蓝字关注我们01专业特色计算机网络技术专业所有在职专任教师都具有高级职称和硕士学位,双师比例为75%;在企业核心岗位工作的兼职老师4人。筹备组建华为ICT学院。华为ICT学院是华为公司主导的,面向全球在校大学生传递华为ICT技…

linux日志自动按天保存,linux实现按天生成日志文件并自动清理

linux实现按天生成日志文件并自动清理前篇文章中讲到如何在Linux crontab创建每秒执行的方法,高人可能早意识到日志文件没做处理,假如没人工处理久了日后越来越大肯定会出现问题,当然人工处理也不现实。为了解决这个问题,所以有了…

通达信版弘历软件指标_中线公式指标(副图 通达信 贴图)明确文字提示,辅助判断中线走势下载_通达信公式...

中线公式指标(副图 通达信 贴图)明确文字提示,辅助判断中线走势下载详细说明第一股票公式网()告诉您:当前正要下载:中线公式指标(副图 通达信 贴图)明确文字提示,辅助判断中线走势下载 中线公式指标(副图 通达信 贴图)明确文字提示…

新巴巴运动网 项目第十一天

新巴巴运动网 项目第十一天 今天内容 购物车 创建购物车对象 加入购物车分析开发流程 加入购物车代码开发 同款商品合并(非登陆时、已登陆时) 去购物车结算分析开发流程 去购物车结算代码开发 创建购物车对象 购物项 Sku 是否有货 数量 购物车 List<购物项> 结果集 小计…

eclipse 插件教程_编写Eclipse插件教程–第1部分

eclipse 插件教程Eclipse是三个最受欢迎的Java开发IDE之一。 其成功的原因之一是其可扩展性。 对于任何知道该怎么做并且已经做到的人来说&#xff0c;编写eclipse插件都可以非常轻松快捷。 不幸的是&#xff0c;第一次在Eclipse中进行操作会非常耗时且令人沮丧。 Eclipse框架非…

mac cad石材填充图案_CAD电视背景墙画法步骤

在做室内装修设计的时候&#xff0c;电视背景墙往往是我们需要考虑的重点。1、打开平面布置图。2、复制一份&#xff0c;主要复制电视墙区域。3、矩形选框框选电视墙区域。4、删除选框意外的线条。5、旋转90度&#xff0c;让我们正对电视墙。6、在下方画基准线&#xff0c;作为…

运行时间_运行一段时间报高压保护

请点击蓝字“阿理支持连”关注哦一起来探索空调的技术Discovery ●运行一段时间报高压保护某地区用户报修一台柜机运行一段时间(20分钟)后报E1高压保护&#xff0c;到底怎么回事呢&#xff1f;让我们一起来探讨一下吧&#xff01;一、案例描述这是一套定频柜机&#xff0c;E1高…