【Java 8】Lambda表达式介绍

news/2025/2/25 17:08:09

目录

1、Lambda简介

2、语法介绍

3、Lambda表达式示例

3.1、无参数的 Lambda 表达式

3.2、单个参数的 Lambda 表达式

3.3、多个参数的 Lambda 表达式

3.4、带语句块的 Lambda 表达式

 4、Lambda使用场景

4.1、替代匿名内部类

4.2、集合操作

4.3、排序

 4.4、函数式接口

4.4.1、自定义函数式接口

4.4.2、常用内置函数式接口

4.5、方法引用

4.5.1、静态方法引用

4.5.2、实例方法引用

4.5.3、构造方法引用 

5、Lambda 表达式的变量作用域

6、Lambda 表达式的限制

7、总结


 

1、Lambda简介

Java 8 引入了 Lambda 表达式,这是 Java 语言的一个重要特性,使得代码更加简洁和易读。Lambda 表达式允许你将功能作为方法参数传递,或者将代码作为数据来处理。

2、语法介绍

java">(parameters) -> expression

或者

java">(parameters) -> { statements; }
  • parameters: 参数列表,可以为空或包含一个或多个参数。

  • ->: Lambda 操作符,将参数和表达式或语句块分开。

  • expression: 单个表达式,Lambda 表达式会返回该表达式的结果。

  • { statements; }: 语句块,可以包含多条语句,需要使用 return 语句返回值(如果有返回值)。

3、Lambda表达式示例

3.1、无参数的 Lambda 表达式

java">() -> System.out.println("Hello, World!");

3.2、单个参数的 Lambda 表达式

java">x -> x * x

3.3、多个参数的 Lambda 表达式

java">(x, y) -> x + y

3.4、带语句块的 Lambda 表达式

java">(x, y) -> {
    int sum = x + y;
    return sum;
}

 4、Lambda使用场景

4.1、替代匿名内部类

Lambda 表达式常用于替代匿名内部类,尤其是在使用函数式接口时。

java">// 使用匿名内部类
Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello, World!");
    }
};

// 使用 Lambda 表达式
Runnable r2 = () -> System.out.println("Hello, World!");

4.2、集合操作

Lambda 表达式可以与 Java 8 引入的 Stream API 结合使用,简化集合操作。

java">List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

// 使用 Lambda 表达式遍历集合
names.forEach(name -> System.out.println(name));

// 使用 Lambda 表达式过滤集合
List<String> filteredNames = names.stream()
                                  .filter(name -> name.startsWith("A"))
                                  .collect(Collectors.toList());

4.3、排序

Lambda 表达式可以简化排序操作。

java">List<String> names = Arrays.asList("Charlie", "Alice", "Bob");

// 使用 Lambda 表达式排序
names.sort((a, b) -> a.compareTo(b));

 4.4、函数式接口

Lambda 表达式通常与函数式接口一起使用。函数式接口是只包含一个抽象方法的接口。Java 8 提供了许多内置的函数式接口,如 RunnableCallableComparator 等。

4.4.1、自定义函数式接口

你可以定义自己的函数式接口,然后使用表达式实现。

java">@FunctionalInterface
interface MyFunctionalInterface {
    void myMethod();
}


MyFunctionalInterface mfi = () -> System.out.println("My Method");
mfi.myMethod();

4.4.2、常用内置函数式接口

  • Predicate<T>: 接受一个参数并返回一个布尔值。

  • Consumer<T>: 接受一个参数并执行操作,不返回任何结果。

  • Function<T, R>: 接受一个参数并返回一个结果。

  • Supplier<T>: 不接受参数,返回一个结果。

4.5、方法引用

方法引用是 Lambda 表达式的一种简化形式,用于直接引用已有方法。

4.5.1、静态方法引用

java">List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.forEach(System.out::println);

4.5.2、实例方法引用

java">String str = "Hello";
Supplier<Integer> lengthSupplier = str::length;
System.out.println(lengthSupplier.get());

4.5.3、构造方法引用 

java">Supplier<List<String>> listSupplier = ArrayList::new;
List<String> list = listSupplier.get();

5、Lambda 表达式的变量作用域

Lambda 表达式可以访问外部的局部变量,但这些变量必须是 final 或事实上是 final 的(即不可变)。

java">int num = 10;
Runnable r = () -> System.out.println(num); // num 必须是 final 或事实上是 final

6、Lambda 表达式的限制

  • Lambda 表达式只能用于函数式接口。

  • Lambda 表达式不能包含 breakcontinue 语句。

  • Lambda 表达式不能抛出检查异常(除非函数式接口允许)。

7、总结

Java 8 的 Lambda 表达式极大地简化了代码,使得函数式编程在 Java 中变得更加容易。通过 Lambda 表达式,你可以编写更简洁、更易读的代码,尤其是在处理集合、多线程和事件驱动编程时。


http://www.niftyadmin.cn/n/5865747.html

相关文章

Java使用EasyExcel实现异步导出

以下是使用 EasyExcel 工具类实现异步导出功能的 Demo&#xff0c;包括用户发起导出请求后&#xff0c;系统先返回响应&#xff0c;后台读取数据并上传至 COS&#xff0c;最后通知用户下载的完整流程。 实现步骤 用户发起导出请求 前端调用导出接口&#xff0c;后端立即返回响应…

【Linux】Ubuntu中,如何创建软件的快捷方式放到桌面上

本文主要介绍Ubuntu中&#xff0c;如何创建软件的快捷方式放到桌面上 首先进入到/usr/share/applications/路径下&#xff0c;找到自己想要的软件&#xff0c;这里以我的vim为例子 ricardoDESKTOP-8T8LHV5:/usr/share/applications$ ls byobu.desktop io.snapcraft.SessionA…

AI回答:Linux C/C++编程学习路线

Linux C/C编程学习路线需要结合Linux系统特性和C/C语言的特点&#xff0c;以下是一个系统化的学习路径&#xff0c;适合从初学者到进阶者&#xff1a; 第一阶段&#xff1a;Linux基础 Linux操作系统基础 学习Linux基本命令&#xff1a;ls、cd、mkdir、rm、grep、find等。 理解…

软件项目开发中,产品经理借助 AI 工具将产品设计转化为需求的方法

软件项目开发中&#xff0c;产品经理借助 AI 工具将产品设计转化为需求的方法 在软件项目开发流程里&#xff0c;产品经理承担着将产品设计转化为详细需求的关键任务。AI 工具的兴起为这一过程带来了全新的助力&#xff0c;下面结合实例来看看产品经理如何巧妙运用 AI 工具。 一…

ubuntu-24.04.1-desktop 中安装 QT6.7

ubuntu-24.04.1-desktop 中安装 QT6.7 1 环境准备1.1 安装 GCC 和必要的开发包:1.2 Xshell 连接 Ubuntu2 安装 Qt 和 Qt Creator:2.1 下载在线安装器2.2 在虚拟机中为文件添加可执行权限2.3 配置镜像地址运行安装器2.4 错误:libxcb-xinerama.so.0: cannot open shared objec…

YOLO11改进-模块-引入混合结构模块Mix Structure Block 提高多尺度、小目标

在图像去雾领域&#xff0c;传统的基于卷积神经网络&#xff08;CNN&#xff09;和 Transformer 的方法存在局限性。CNN 方法大多存在感受野不足的问题&#xff0c;限制了单个像素在神经网络中的参考范围&#xff0c;部分考虑大感受野的 CNN 方法又忽略了图像的多尺度特性&…

Unity制作游戏项目——Unity项目如何导出安装包(Inno Setup Compiler的使用)——附有Inno Setup Compiler软件安装包

1.将完成的Unity项目构建成适合Windows平台可执行文件。 步骤一&#xff1a;点击File--Build Settings&#xff08;CtrlshiftB&#xff09; 步骤二&#xff1a;进行基础配置&#xff0c;点击build&#xff0c;选择将要导出的文件夹 “Windows”&#xff1a;具体指定了目标平台…

深度解析SmartGBD助力Android音视频数据接入GB28181平台

在当今数字化时代&#xff0c;视频监控与音视频通信技术在各行各业的应用愈发广泛。GB28181协议作为中国国家标准&#xff0c;为视频监控设备的互联互通提供了规范&#xff0c;但在实际应用中&#xff0c;许多Android终端设备并不具备国标音视频能力&#xff0c;这限制了其在相…