”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Java 中的流和 Lambda:函数式编程示例指南

Java 中的流和 Lambda:函数式编程示例指南

发布于2024-08-21
浏览:883

Streams and Lambdas in Java: A Guide to Functional Programming with Examples

函数式编程是现代软件开发中广泛使用的方法。 Java 是一种同时支持面向对象和函数式编程的语言,在其第 8 个版本中引入了流和 lambda。这些功能允许开发人员将函数式风格应用于集合,使集合操作更加高效和干净。

Java 中的流
Java 中的流将集合转变为元素流。它们使开发人员能够对集合执行功能操作,例如映射、过滤和归约。流最适合涉及数据转换、聚合或过滤的操作。

使用流的一个示例是按字母顺序对名称列表进行排序。我们可以创建一个名称列表,然后使用流对它们进行排序,如下所示:

List 名称 = Arrays.asList("约翰", "玛丽", "大卫", "艾米丽", "汤姆");
name.stream().sorted().forEach(System.out::println); //输出:大卫、艾米丽、约翰、玛丽、汤姆

在这里,我们使用列表上的stream()方法创建了一个流。然后我们应用了sorted()方法来按自然顺序对流中的元素进行排序。最后使用forEach()方法打印流中的每个元素。

Java 中的 Lambda 函数
Lambda 用于在 Java 中定义一等函数。这些函数可以使用流中的元素并对它们执行操作。 Lambda 是在类外部定义的,可以作为参数传递给函数。

要将 lambda 表达式与流结合使用,我们需要了解函数式接口的概念。这些接口只有一个抽象方法。 Lambda 表达式可用于为函数式接口的抽象方法提供具体实现。

使用 lambda 对名称列表进行排序
在上面的示例的基础上,让我们使用 lambda 对名称进行降序排序。

List 名称 = Arrays.asList("约翰", "玛丽", "大卫", "艾米丽", "汤姆");
name.stream().sorted((a, b) -> b.compareTo(a)).forEach(System.out::println)); //输出:汤姆、玛丽、约翰、艾米丽、大卫

在这里,我们使用 lambda 表达式作为 Sorted() 方法的参数。此 lambda 函数接受两个参数(a 和 b)并对它们进行比较,根据比较结果返回正值、负值或零值。这允许我们使用元素上的compareTo()方法按降序对元素进行排序。

将流转回集合
在某些情况下,我们可能希望在对流执行操作后将其转换回集合。我们可以使用collect()方法来做到这一点,该方法接受Collector对象作为参数。

ListfilteredNames=names.stream()
.filter(name -> name.length() > 4) //仅保留长度> 4的名称
.collect(Collectors.toList()); //返回过滤后的名称列表

collect() 方法采用 Collector 类型的功能接口,并使用它将元素累积到集合中。在上面的示例中,我们使用 Collectors 类中的 toList() 方法来创建过滤名称列表。

流上的其他操作
除了排序和过滤之外,还可以对流执行其他操作,例如映射、归约和迭代。这些操作允许我们分别对流中的元素进行转换、减少和迭代。

映射和减少数字流
假设我们有一个数字列表,我们想要找到所有偶数的总和。我们可以使用map()和reduce()方法来做到这一点。

List 数字 = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int sum = Numbers.stream()
.filter(num -> num % 2 == 0) //过滤掉奇数
.map(num -> num * 2) //偶数加倍
.reduce(0, (a, b) -> a b); //将所有数字加在一起

在这里,我们使用map()方法将流中的偶数加倍,然后使用reduce()方法将所有数字加在一起。结果是列表中所有偶数的总和。

流上的重用操作
在某些情况下,我们可能需要在多个流上使用相同的功能操作。为了避免一遍又一遍地编写相同的代码,我们可以创建一个函数接口并将其作为参数传递给方法。

让我们以按姓氏对姓名列表进行排序为例。我们可以创建一个实现Comparator接口的比较器类,并将其作为参数传递给sorted()方法。

静态类 LastNameComparator 实现 Comparator {
@覆盖
公共 int 比较(字符串名称1,字符串名称2){
String[] parts1 = name1.split(" ");
字符串lastName1 = parts1[parts1.length - 1];
String[] parts2 = name2.split(" ");
字符串lastName2 = parts2[parts2.length - 1];
返回lastName2.compareTo(lastName1);
}
}

name.stream().sorted(new LastNameComparator()).forEach(System.out::println); //输出:艾米丽、大卫、约翰、玛丽、汤姆

在这里,我们将 LastNameComparator 作为参数传递给排序()方法,以按姓氏对名称进行排序。

结论
Java 中的流和 lambda 提供了一种强大且高效的方法来对集合执行函数操作。它们使开发人员能够编写干净、简洁且可重用的代码。通过理解流和 lambda 的概念,我们可以提高整体编码技能并编写更高效的代码。

提高 Java 技能的一种有效方法是获得最新的 Java 认证并使用 MyExamCloud 上提供的 1Z0-830 练习测试。

版本声明 本文转载于:https://dev.to/myexamcloud/streams-and-lambdas-in-java-a-guide-to-functional-programming-with-examples-4cij?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Websocket 或 Socket io!让我们来看看吧!
    Websocket 或 Socket io!让我们来看看吧!
    WebSockets 与 Socket.IO:实时对决 当谈到网络上的实时通信时,开发人员经常发现自己陷入两个选择之间:WebSockets 和 Socket.IO。这两种工具都擅长它们的工作——提供了一种在客户端和服务器之间实现双向通信的方法——但每种工具都有自己独特的个性。这有...
    编程 发布于2024-11-02
  • Deno 起飞
    Deno 起飞
    网络是人类最大的软件平台,拥有超过 50 亿用户,并且还在不断增长。然而,随着 Web 开发需求的飙升,其复杂性也随之增加。在无尽的配置文件、大量的样板文件和大量的依赖项之间,开发人员花费更多的时间来进行设置,而不是构建下一个大东西。? 进入 Deno,这是一种用于 JavaScript 和 Typ...
    编程 发布于2024-11-02
  • 使用 Django Rest Framework 寻找海森堡
    使用 Django Rest Framework 寻找海森堡
    The idea The idea was to create a simple platform for DEA agents, to manage information about characters from the Breaking Bad/Better Call Sa...
    编程 发布于2024-11-02
  • 汤姆和杰瑞灯代码
    汤姆和杰瑞灯代码
    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ...
    编程 发布于2024-11-02
  • 通过实践学习 TDD:在 Umbraco 的富文本编辑器中标记成员
    通过实践学习 TDD:在 Umbraco 的富文本编辑器中标记成员
    在我正在构建的系统中,我需要能够在网站的文本中提及 Umbraco 成员。为此,我需要构建 Umbraco 富文本编辑器的扩展:TinyMCE。 语境 作为内容编辑者,我想在消息或文章中标记成员,以便他们收到有关其新内容的通知。 我研究了类似的实现,例如 Slack 或 X 上的实现...
    编程 发布于2024-11-02
  • 如何在Python测试场景中模拟HTTP请求和响应?
    如何在Python测试场景中模拟HTTP请求和响应?
    Python 测试的模拟请求和响应在 Python 测试中,有必要模拟模块及其功能来控制执行流程并验证具体场景。其中,模拟 requests 模块通常用于测试依赖于 HTTP 请求的函数或方法。考虑一个包含以下代码的views.py 文件:def myview(request): res1 ...
    编程 发布于2024-11-02
  • 如何构建适用于 Windows、Linux 和 macOS 的 Python 条码扫描器
    如何构建适用于 Windows、Linux 和 macOS 的 Python 条码扫描器
    条形码扫描已成为从零售、物流到医疗保健等各个行业的重要工具。在桌面平台上,它可以快速捕获和处理信息,无需手动输入数据,从而节省时间并减少错误。在本教程中,我们将通过构建适用于 Windows、Linux 的 Python 条形码扫描仪 继续探索 Dynamsoft Capture Vision SD...
    编程 发布于2024-11-02
  • ## 如何在 Python 中创建不可变对象以及为什么 nametuple 是最好的方法?
    ## 如何在 Python 中创建不可变对象以及为什么 nametuple 是最好的方法?
    Python 中的不可变对象在 Python 中,不变性为保护数据完整性提供了一种有价值的机制。然而,创建不可变对象会带来一定的挑战。重写 setattr常见的方法是重写 setattr方法。然而,即使在 init 过程中也会调用此方法,因此它不适合创建不可变对象。子类化 Tuple另一种策略涉及对...
    编程 发布于2024-11-02
  • 最常被问到的 React 面试问题
    最常被问到的 React 面试问题
    如何优化 React 应用程序的性能? 1。组件应谨慎更新 实现 shouldComponentUpdate 或 React.memo 通过比较 props 或 states 来防止不必要的重新渲染。 2.使用功能组件和钩子 带钩子的功能组件通常比类组件性能更高。 3.延迟加载组件...
    编程 发布于2024-11-02
  • (Wordpress 初学者):仅将子域从托管转移(迁移)到另一个新托管。
    (Wordpress 初学者):仅将子域从托管转移(迁移)到另一个新托管。
    我只想从 Bluehost 托管转移(迁移)一个新托管(例如 Fastcomet 或 Chemicloud)的子域。 我想知道我迁移子域的步骤是否正确以及我应该做什么更改 DNS 内容...... ** 我的情况1:** – 主 Web 域(例如:forcleanworld.com)保留在 Blue...
    编程 发布于2024-11-02
  • 使用 Java 进行数据分析:信息处理初学者指南
    使用 Java 进行数据分析:信息处理初学者指南
    Java 是一种适用于数据分析的强大语言,它提供用于处理大型数据集和执行复杂分析的基础结构,包括:数据结构:用于存储和组织数据的集合,例如数组和列表。IO 流:用于读取和写入文件的对象。Java 集合框架:用于管理和操作数据结构的强大集合类库。使用 Java 进行数据分析的实际案例包括分析文本文件,...
    编程 发布于2024-11-02
  • 雇用自由 Python 开发人员时要避免的常见错误
    雇用自由 Python 开发人员时要避免的常见错误
    介绍 雇用合适的自由 Python 开发人员可以决定你的项目的成败。然而,许多企业在招聘过程中会犯一些常见的错误,这些错误可能会导致招聘延迟、成本超支和结果不佳。以下是如何避免这些陷阱并确保项目成功的方法。 没有明确定义项目要求 最常见的错误之一是在开始招聘流程之前...
    编程 发布于2024-11-02
  • AWS SAM Lambda 项目的本地开发服务器
    AWS SAM Lambda 项目的本地开发服务器
    现在我正在开发一个项目,其中使用 AWS lambda 作为请求处理程序构建 REST API。整个过程使用 AWS SAM 定义 lambda、层并将其连接到漂亮的 template.yaml 文件中的 Api 网关。 问题 在本地测试此 API 并不像其他框架那样简单。虽然 AW...
    编程 发布于2024-11-02
  • 什么是 React?
    什么是 React?
    最近,我决定通过注册 元前端开发人员专业证书将我的技能提升到一个新的水平。 专业化涵盖各种主题,从基本的 Web 开发语言(例如 HTML、CSS 和 JavaScript)到高级框架 React。 通过这篇文章和以下博客文章,我的目标是分享我在通过认证过程中的经验、学习和进步。 所以… ...
    编程 发布于2024-11-02
  • 如何在C++中实现虚拟运算符重载?
    如何在C++中实现虚拟运算符重载?
    虚拟运算符重载背景在 C 中,可以为自定义数据类型重载运算符,从而提供定制的行为。然而,允许多态行为的虚拟方法不能直接用于运算符重载。问题考虑创建一个虚拟运算符
    编程 发布于2024-11-02

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3