首页 > Java > java教程 > 掌握 Java 中的 Lambda 表达式综合指南

掌握 Java 中的 Lambda 表达式综合指南

Patricia Arquette
发布: 2024-11-03 07:41:03
原创
184 人浏览过

Java Lambda 表达式简介

尽管发布了许多新的 Java 版本,但由于其强大的变革性功能,Java 8 仍然是最广泛采用的版本之一。 Java 8 中引入的 Lambda 表达式特别受欢迎,因为它们通过支持函数式编程使 Java 更加简洁和高效。此功能允许开发人员用简化的语法替换冗长的匿名内部类,使代码更具可读性和可维护性。

在本指南中,我们将探讨 Lambda 表达式如何简化代码、增强集合中的数据处理,并使 Java 开发人员能够编写现代的高性能应用程序。

Mastering Lambda Expressions in Java A Comprehensive Guide

理解 Lambda 表达式:基础知识

从本质上讲,Lambda 表达式是一种以更简单的语法表示函数式接口的单个​​抽象方法的方法。此功能与单一抽象方法 (SAM) 概念相一致,该概念允许将具有单个未实现方法的接口视为 Lambda 兼容。

Lambda 语法:
Lambda 表达式通常由三部分组成:

  1. 参数列表 – 函数所需的输入值。
  2. 箭头标记 (->) – 将参数与函数体分开。
  3. Body – 执行操作的代码块,可以是表达式,也可以是大括号括起来的代码块。
(parameters) -> expression
(parameters) -> { statements; }
登录后复制
登录后复制
登录后复制
登录后复制

Lambda 表达式示例

  • 一个基本的 Lambda 表达式,它接受两个整数并返回它们的和:
  (int x, int y) -> x + y
登录后复制
登录后复制
登录后复制
登录后复制
  • 接受单个字符串并打印它的 Lambda 表达式:
  (String message) -> System.out.println(message)
登录后复制
登录后复制
登录后复制
登录后复制

Java 中的 Lambda 表达式的语法既灵活又直观,当需要多行代码时,开发人员可以在简洁的单行格式或更详细的块之间进行选择。


Lambda 表达式如何简化 Java 代码

在 Java 8 之前,实现 Runnable 或 Comparator 等接口需要匿名内部类。 Lambda 表达式简化了这个过程,用更实用的风格替换了样板代码。以下是 Lambda 表达式如何简化常见任务的比较:

示例 1:将 Lambda 表达式与 Runnable 结合使用

考虑一个简单的 Runnable 实现。使用匿名内部类将如下所示:

Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello world one!");
    }
};
登录后复制
登录后复制
登录后复制
登录后复制

使用 Lambda 表达式,此代码可以简化为:

(parameters) -> expression
(parameters) -> { statements; }
登录后复制
登录后复制
登录后复制
登录后复制

具有通用函数接口的 Lambda 表达式

Java 8 在 java.util.function 包中引入了一组预定义的函数接口。这些接口,例如谓词、函数、消费者和供应商,为 Lambda 表达式提供了基础,允许开发人员利用函数式编程原理。

  1. Predicate – 表示一个条件,根据输入返回 true 或 false。
  2. 函数 – 接受一个参数并产生一个结果。
  3. 消费者 – 对单个输入执行操作而不返回结果。
  4. 供应商 – 提供输出而不接受任何输入。

通过将这些接口与 Lambda 表达式结合使用,Java 开发人员可以执行不仅简洁而且可高度重用的操作。


Lambda 表达式的真实用例

要了解 Lambda 表达式的实际应用,让我们通过几个场景来展示它们如何取代冗长的语法、简化常见操作并增强可读性。


可运行的 Lambda 示例

Java中的Runnable接口代表一个可以由线程执行的任务。该类必须定义一个名为 run 的无参数方法。以下是 Lambda 表达式如何简化 Runnable 实现。

可使用匿名内部类运行:

  (int x, int y) -> x + y
登录后复制
登录后复制
登录后复制
登录后复制

可使用 Lambda 表达式运行:

  (String message) -> System.out.println(message)
登录后复制
登录后复制
登录后复制
登录后复制

使用 Lambda 表达式将五行代码减少为一行,突出显示它们如何简化 Java 代码。


比较器 Lambda 示例

Comparator 接口通常用于定义集合的排序逻辑。使用 Lambda 表达式,定义自定义排序标准变得更加简洁和直观。

按姓氏对人员列表进行排序的比较器:

Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello world one!");
    }
};
登录后复制
登录后复制
登录后复制
登录后复制

Lambda 表达式可以通过更改比较逻辑轻松地在排序顺序之间切换,例如降序排列:

Runnable r2 = () -> System.out.println("Hello world two!");
登录后复制
登录后复制
登录后复制

这种方法在需要动态排序的应用程序中特别有用,允许开发人员根据用户输入或其他条件轻松交换排序标准。


将 Lambda 表达式与事件监听器结合使用

在 GUI 编程中,事件监听器通常用于处理用户操作。传统上,需要匿名内部类,从而导致代码冗长。然而,Lambda 表达式提供了一种更简洁的方法来实现这些侦听器。

具有匿名内部类的 ActionListener:

Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Running with anonymous inner class");
    }
};
r1.run();
登录后复制
登录后复制

带有 Lambda 表达式的 ActionListener:

(parameters) -> expression
(parameters) -> { statements; }
登录后复制
登录后复制
登录后复制
登录后复制

Lambda 表达式使开发人员能够直接在一行中实现 ActionListener,增强可读性并减少样板代码。


高级用例:使用谓词进行过滤

软件应用程序中的一个常见场景是根据多个标准过滤数据。在 Java 中,可以通过将 Lambda 表达式与 Predicate 接口相结合来有效处理此问题,从而允许动态过滤集合。

考虑一个 Person 对象列表,我们要根据不同的条件(例如年龄和性别)进行过滤。

定义基于谓词的 SearchCriteria 类:

  (int x, int y) -> x + y
登录后复制
登录后复制
登录后复制
登录后复制

SearchCriteria 类封装了过滤列表的常见条件,允许灵活地将不同的过滤器应用于单个集合。

使用过滤条件:

  (String message) -> System.out.println(message)
登录后复制
登录后复制
登录后复制
登录后复制

这种方法消除了对多个 for 循环的需要,提供了更干净、可重用且更易于维护的解决方案。

Mastering Lambda Expressions in Java A Comprehensive Guide

使用 Lambda 表达式流式传输 API 和集合

Java 8 的 Stream API 彻底改变了集合的处理方式,特别是通过 Lambda 表达式实现高效的数据过滤、转换和聚合。流允许延迟处理,仅在需要时处理数据,从而提高大型数据集的性能。

使用 forEach 循环

Stream API 中的 forEach 方法提供了传统 for 循环的替代方法,使 Lambda 表达式能够应用于集合中的每个元素。这是一个迭代 Person 对象列表的示例。

Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello world one!");
    }
};
登录后复制
登录后复制
登录后复制
登录后复制

使用方法参考:
对于可以重用现有方法的情况,Java 允许方法引用,这是一种增强可读性的简写。

Runnable r2 = () -> System.out.println("Hello world two!");
登录后复制
登录后复制
登录后复制

过滤、映射和收集

Stream API 允许将操作链接在一起,使开发人员能够在单个语句中过滤、映射和收集结果。

示例:过滤和收集:

Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Running with anonymous inner class");
    }
};
r1.run();
登录后复制
登录后复制

此代码使用 SearchCriteria 类中定义的条件仅过滤 18 至 25 岁的男性。

使用地图进行映射和转换:
map 方法转换集合中的每个元素,例如通过提取或修改属性。

Runnable r2 = () -> System.out.println("Running with Lambda Expression");
r2.run();
登录后复制

使用地图进行计算:
mapToInt 和 mapToDouble 方法对于数值计算很有帮助。

(parameters) -> expression
(parameters) -> { statements; }
登录后复制
登录后复制
登录后复制
登录后复制

理解流中的懒惰和渴望

流支持惰性操作和急切操作,惰性操作(例如过滤器)仅在需要时应用。这种惰性通过仅处理必要的元素来优化性能。

  1. 惰性操作:仅在达到终端操作(如收集)时应用。
  2. Eager Operations:对所有元素立即执行,常用于聚合。

惰性求值示例:

  (int x, int y) -> x + y
登录后复制
登录后复制
登录后复制
登录后复制

只处理年龄大于30岁的人,并打印姓氏,体现了懒惰过滤。


使用流进行并行处理

Java 的并行流方法将任务分配到多个线程,为大型数据集提供显着的性能提升。

并行流示例:

  (String message) -> System.out.println(message)
登录后复制
登录后复制
登录后复制
登录后复制

并行处理划分工作负载,使计算密集型任务的集合操作更快。

突变和收集结果

由于流本质上是不可变的,因此需要收集结果来保留它们。 collect 方法提供了一种聚合和保留流操作结果的方法。

示例

Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello world one!");
    }
};
登录后复制
登录后复制
登录后复制
登录后复制

这里,过滤后的结果存储在列表中以供进一步处理,允许开发人员以结构化的方式管理复杂的数据流。

Mastering Lambda Expressions in Java A Comprehensive Guide

结论:Java 8 中 Lambda 表达式的强大功能

Java 8 的 Lambda 表达式与 Stream API 相结合,代表了向函数式编程的重大转变,使代码更加简洁、更具表现力和可维护性。通过替换匿名内部类、增强集合处理以及支持并行操作,Lambda 表达式已成为编写现代 Java 应用程序的基石。

欢迎对本文进行任何更正或补充。

感谢您的阅读!

Runnable r2 = () -> System.out.println("Hello world two!");
登录后复制
登录后复制
登录后复制

以上是掌握 Java 中的 Lambda 表达式综合指南的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板