lambda 分类聚合_使用Java 8 Lambda,流和聚合

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服务器的名称

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

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

我们的第一步是在第76行–我们必须从服务器列表中获取流。 一旦有了流,就在第77行添加过滤器中间操作。过滤器操作将服务器流作为输入,然后生成另一个服务器流,该服务器流仅包含与过滤器lambda中指定的条件匹配的服务器。 我们仅选择Dell使用以下lambda制造的服务器: 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终端操作。 collect终端操作将服务器流作为输入,然后将它们放入参数中指定的数据结构中。 在我们的例子中,我们将流转换为服务器列表。 结果列表由第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 。 这是必需的,因为平均值返回类型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

lambda 分类聚合

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

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

相关文章

linux镜像文件不要大于4g,Systemback制做大于4G的Ubuntu系统镜像

1 安装Systemback依此执行以下命令。sudo apt-get updatesudo add-apt-repository ppa:nemh/systembacksudo apt-get update && sudo apt-get install systemback unionfs-fuse安装完成:2 使用Systemback生成镜像文件输入管理员密码,打开后界面以…

黑马2016java_2016年成功的Java开发人员简介

黑马2016java2015年即将结束。 现在该总结过去一年中已完成的工作和未完成的工作。 此外,现在是预测下一个2016年的好时机。 您已经猜到这篇文章是关于2016年理想的Java开发人员的。 我想给你一个惊喜,这次我更改了预测的格​​式。 为了使预测更加客观…

spring一站式开发_Spring开发人员知道的一件事

spring一站式开发在最近的(核心)Spring框架培训课程中,有人问我:“(Java)Spring开发人员应该知道的一件事是什么?” 这个问题使我措手不及。 是的,(核心)Spri…

jax-ws和jax-rs_带有JAX-WS和Spring的Web服务应用程序

jax-ws和jax-rs1.简介 这是一个漫长的等待,但是我最终要发布有关使用Spring创建第一个基于SOAP的Web服务应用程序的教程。 JAX-WS (用于XML Web服务的Java API)是用于以XML格式创建Web服务的一组API,我们最常将其称为基于SOAP的We…

eclipse开发jsf_在Eclipse上创建JSF / CDI Maven项目

eclipse开发jsf当我在研究JSF和CDI示例时,我认为提到创建JSF和CDI Maven项目所需的步骤会很有用。 您可以找到以下步骤。 工具类 默认情况下,M2E插件随附的Eclipse Luna。 因此,无需自己安装插件。 WildFlye8.x。 从主菜单中选择文件->…

apache camel_Apache Camel的性能调整思路

apache camel时不时地,我会以Camel速度较慢的观点来询问有关优化Camel应用程序的问题。 骆驼只是连接不同系统的粘合剂,路由引擎全部在内存中,并且不需要任何持久状态。 因此,在99%的情况下,性能问题是由于…

xmanager linux,教您用xmanager启动Linux上的图形界面程序-Go语言中文社区

对于习惯实体化的开发人员来说,还是界面化用着比较习惯,所以这就涉及到掌握使用Xmanager启动Linux上的图形界面程序,为了方便大家的使用,本集小编就详细的为大家讲解具体操作。具体步骤如下:1、首先下载Xmanager并安装…

android开发 文件分享到应用,Android 实现文件分享功能(共享多个文件)

效果如图:神一样的代码:针对image代码如下:IntentsharenewIntent(Intent.ACTION_SEND);share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));//此处一定要用Uri.fromFile(file),其中file为File类型,否则附件无法发送成功。s…

android 4.4.2截屏方法,android4.4.2 使用 uiautoviewer 截屏报错

1、正常启动后,使用 uiautomatorviewer 没有问题2、由于要使用 uiautomator,每次启动 uiautomator 服务后再使用 uiautomatorviewer 就会图片错误,启动 uiautomator 服务的步骤如下:1、Download jar files from uiautomator jsonr…

javaone_JavaOne 2015:为JDK 9做准备– blog @ CodeFX

javaoneJavaOne 2015看到了Project Jigsaw团队关于Java 9中的模块化的一系列讨论 。它们都是非常有趣的,并且充满了宝贵的信息,我敦促每个Java开发人员都注意它们。 除此之外,我想给社区一种搜索和引用它们的方法,因此我在这里总…

kafka spark_您在2016年会做什么? Apache Spark,Kafka,Drill等

kafka spark让我们玩得开心。 这是新的一年的开始-我们正处于新事物的门槛上-因此让我们期待您在2016年可能会做的事情。现在我知道做出预测的风险,尤其是有记录的预测,但是我很高兴您能在一年后回访,看看我对2016年的预测是如何完成的。 您…

android ini文件格式,ini是什么格式的文件?ini文件怎么操作?

类型:Android平台大小:622KB语言:中文 评分:5.0标签:立即下载ini文件主要存放用户所做的选择以及系统的各种参数。用户可以通过修改INI文件,来改变应用程序和系统的很多配置。自定义一个文件,会成一个deskt…

华为p6电信版 android 4.5,华为P6电信版系统应用apk补全教程 完整EMUI

现在要说的是华为P6电信版的系统应用apk补全教程,给你一个非阉割版的完整EMUI系统。大家应该都知道,电信定制版由于华为系统服务与电信的定制APP功能重叠,语音助手、云同步、云端备份、手机找回等系统应用apk全被“阉割”掉了,这几…

黑马ee在职进阶视频_进阶– Java EE 7前端5强

黑马ee在职进阶视频系列继续。 在初步概述和Arjan关于最重要的后端功能的文章之后 ,我现在非常高兴让Ed Burns( edburns )使用他最喜欢的Java EE 7前端功能完成本系列。 感谢Markus Eisele让我有机会在他非常受欢迎的博客上发表帖子。 我和M…

如何构建股票ChatGPT查询全球股票市场以及常用Prompt

Blog:4 ways to use ChatGPT Stock Chatbot for stock analysis of Global Stock Markets NASDAQ NYSE LSE HKEX TSE NSE HANGHAI SHENZHEN 地址:http://deepnlp.org/blog/chatgpt-stock-global-market 全球股票市场:NASDAQ 纳斯达克, NYSE…

jvm高并发_JVM上的高并发HTTP客户端

jvm高并发HTTP可能是最流行的应用程序级别协议,并且有许多库在网络I / O之上实现它,这是常规I / O的一种特殊(面向流)情况。 由于所有I / O都有很多共同点1 ,所以让我们开始对其进行一些讨论。 我将集中讨论具有大量并…

jmeter 采样器作用_实施自定义JMeter采样器

jmeter 采样器作用随着我们采用不同的体系结构和实现方式,对通用压力测试工具的需求不断增长。 关于负载测试, Apache Jmeter是最知名的工具之一。 它支持许多协议,例如ftp http tcp,并且可以轻松地用于分布式测试。 Jmeter还为…

xp系统 javafx_使用JavaFX构建React系统

xp系统 javafxJavaFX是用于在Java中构建图形应用程序的新标准库,但是许多程序员仍然对Swing甚至(高音)AWT感到困惑。 在Java诞生20年来,发生了很多事情。 两年前,当我开始研究Speedment UI的JavaFX库时,我发…

html手机端图片点击放大缩小快捷键,PS放大缩小图片的快捷键是什么?PS放大缩小图片的操作技巧...

PS放大缩小图片的快捷键是什么?PS怎么放大缩小图片?使用PS处理图片可是个精细的活儿,为了让图片处理得更加完美,我们经常需要将图片放大来处理,修改好之后又要缩小图片看下整体效果,这样来回切换其实挺麻烦…

webstorm html代码提示设置,Webstorm设置代码提示

下载路径: https://github.com/virtoolswebplayer/ReactNative-LiveTemplate本插件可以配合Webstorm设置代码提示。Mac下安装Webstorm2016.1为例安装路径在终端:$ cd ~/Library/Preferences/$ ls找到Webstorm版本$ open WebStorm2016.1先将ReactNative.x…