如何查看网站有没有收录,网站网络,西安网站代维护,wordpress 收费下载资源总览 在本文中#xff0c;我们将介绍使用Java 8 lambda#xff0c;流和聚合来过滤和操作Collection中的对象。 这篇文章中的所有代码都可以在BitBucket中找到 。 在此示例中#xff0c;我们将创建许多对象#xff0c;这些对象代表我们IT基础架构中的服务器。 我们将这些对… 总览 在本文中我们将介绍使用Java 8 lambda流和聚合来过滤和操作Collection中的对象。 这篇文章中的所有代码都可以在BitBucket中找到 。 在此示例中我们将创建许多对象这些对象代表我们IT基础架构中的服务器。 我们将这些对象添加到列表中然后使用lambda流和聚合根据某些条件从列表中检索服务器。 目标 介绍lambda流和聚合操作的概念。 解释流和管道之间的关系。 比较和对比聚合操作和迭代器。 演示过滤器collectforEachmapToLongaverage和getAsDouble聚合操作。 Lambdas Lambda是Java的新功能它使我们能够将功能或行为作为参数传递给方法。 一个说明Lambda有用性的示例来自UI编码。 当用户单击用户界面上的按钮时通常会导致应用程序中发生某些操作。 在这种情况下我们确实希望将行为传递给onClick…方法以便应用程序将在单击按钮时执行给定的行为。 在Java的早期版本中我们通过将匿名内部类实现了已知接口传递给方法来实现此目的。 在这种情况下使用的接口通常仅包含一个方法该方法定义了我们希望传递给onClick…方法的行为。 尽管这可行但语法不方便。 匿名内部类仍可用于此目的但是新的Lambda语法更加简洁。 综合运营 当我们使用Collections将对象存储在程序中时通常需要做的不仅仅是简单地将对象放入集合中-我们需要存储检索删除和更新这些对象。 聚合操作使用lambda对集合中的对象执行操作。 例如您可以使用聚合操作来 打印来自特定制造商的库存中所有服务器的名称 返回早于特定使用期限的库存中的所有服务器 计算并返回清单中服务器的平均使用期限前提是“服务器”对象具有“购买日期”字段 所有这些任务都可以通过使用聚合操作以及管道和流来完成。 我们将在下面看到这些操作的示例。 管道和流 流水线只是一系列聚合操作。 流是一个项目序列而不是数据结构它通过管道从源头承载项目。 管道由以下部分组成 数据源。 最常见的是这是一个Collection但它可能是一个数组方法调用的返回结果或某种I / O通道。 零个或多个中间操作。 例如过滤操作。 中间操作产生新的流。 过滤器操作接收流然后产生另一个流该流仅包含与过滤器条件匹配的项目。 终端操作。 终端操作返回非流结果。 此结果可能是原始类型例如整数Collection或根本没有结果例如该操作可能只是打印流中每个项目的名称。 一些聚合操作例如forEach看起来像迭代器但是它们有根本的区别 聚合操作使用内部迭代。 您的应用程序无法控制元素的处理方式或时间没有next方法。 聚合操作从流而不是直接从集合处理项目。 聚合操作支持Lambda表达式作为参数。 Lambda语法 现在我们已经讨论了与Lambda表达式有关的概念现在该看看它们的语法了。 您可以将Lambda表达式视为匿名方法因为它们没有名称。 Lambda语法包含以下内容 用括号括起来的形式参数的逗号分隔列表。 Lambda表达式中可以省略参数的数据类型。 如果只有一个形式参数则可以省略括号。 箭头标记- 由单个表达式或代码块组成的主体。 使用Lambda流和聚合操作 如概述中所述我们将通过过滤和检索List中的Server对象来演示lambda流和聚合的用法。 我们来看四个例子 查找并打印来自特定制造商的所有服务器的名称。 查找并打印超过一定年限的所有服务器的名称。 查找并提取新的列表到一定年限内的所有服务器然后在新列表中打印服务器的名称。 计算并显示列表中服务器的平均寿命。 让我们开始吧… 服务器类 首先我们来看一下Server类。 Server类将跟踪以下内容 服务器名称 服务器的IP地址 制造商 内存容量GB 处理器数量 购买日期LocalDate 请注意第65行我们添加了getServerAge()方法该方法根据购买日期计算服务器的getServerAge()以年为单位–在计算服务器中平均服务器的寿命时将使用此方法库存。 创建和加载服务器 现在我们有了Server类我们将创建一个List并加载几台服务器 示例1打印所有戴尔服务器的名称 对于第一个示例我们将编写一些代码来查找Dell制造的所有服务器然后将服务器名称打印到控制台 我们的第一步在第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。 上面代码的输出是我们期望的 示例2打印所有超过三年的所有服务器的名称 我们的第二个示例与第一个示例相似不同之处在于我们要查找3年以上的服务器 此示例与第一个示例之间的唯一区别是我们将过滤器操作第89行中的lambda表达式更改为 s - s.getServerAge() age 该过滤器的输出流仅包含3年以上的服务器。 上面代码的输出是 示例3将所有超过3年的服务器提取到新列表中 我们的第三个示例与第二个示例相似因为我们正在寻找使用三年以上的服务器。 本示例中的区别在于我们将创建一个仅包含满足我们条件的服务器的新列表 与前面的示例一样我们从列表中获取流并添加过滤器中间操作以创建仅包含3年以上服务器的流第102和103行。 现在在第104行我们使用collect终端操作而不是forEach终端操作。 收集终端操作将服务器流作为输入然后将它们放入参数中指定的数据结构中。 在我们的例子中我们将流转换为服务器列表。 结果列表由第100行上声明的oldServers变量引用。 最后为了说明在本示例中获得的服务器与上一个服务器相同我们在oldServers列表中打印所有服务器的名称。 请注意因为我们希望列表中的所有服务器所以没有中间过滤器操作。 我们仅从oldServers获取流并将其提供给forEach终端操作。 输出是我们期望的 示例4计算并打印服务器的平均寿命 在最后一个示例中我们将计算服务器的平均寿命 第一步与前面的示例相同–我们从服务器列表中获取流。 接下来我们添加mapToLong中间操作。 此聚合操作将服务器流作为输入并产生Longs流作为输出。 根据第119行上指定的lambda将服务器映射到Longs您也可以在第120行上使用等效语法。 在这种情况下我们要抓住每个传入服务器的年龄并将其放入生成的Longs流中。 接下来我们添加平均终端操作。 平均值完全符合您的期望-计算流中所有值的平均值。 诸如平均值之类的终端操作通过对流的内容进行合并或操作来返回一个值这被称为归约操作 。 归约运算的其他示例包括sum min max和count 。 最后我们添加操作getAsDouble 。 这是必需的因为average返回类型OptionalDouble 。 如果传入流为空则average返回OptionalDouble的空实例。 如果发生这种情况则调用getAsDouble将抛出NoSuchElementException 否则它将仅在OptionalDouble实例中返回Double值。 该示例的输出为 结论 我们仅涉及到您可以使用lambda流和聚合进行的表面处理。 我鼓励您抓住源代码使用它并开始探索这些Java 8新功能的所有可能性。 翻译自: https://www.javacodegeeks.com/2015/12/using-java-8-lambdas-streams-aggregates.html