【Java 8】Lambda表达式介绍

目录

1、Lambda简介

2、语法介绍

3、Lambda表达式示例

[3.1、无参数的 Lambda 表达式](#3.1、无参数的 Lambda 表达式)

[3.2、单个参数的 Lambda 表达式](#3.2、单个参数的 Lambda 表达式)

[3.3、多个参数的 Lambda 表达式](#3.3、多个参数的 Lambda 表达式)

[3.4、带语句块的 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 表达式的变量作用域](#5、Lambda 表达式的变量作用域)

[6、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 表达式,你可以编写更简洁、更易读的代码,尤其是在处理集合、多线程和事件驱动编程时。

相关推荐
mldong2 分钟前
mldong 快速开发框架字典模块设计与实现
java·后端·架构
小猫咪怎么会有坏心思呢5 分钟前
华为OD机考-最小循环子数组-字符串(JAVA 2025B卷)
java·开发语言·华为od
岁忧11 分钟前
(LeetCode 面试经典 150 题) 169. 多数元素(哈希表 || 二分查找)
java·c++·算法·leetcode·go·散列表
YuTaoShao12 分钟前
【LeetCode 热题 100】15. 三数之和——排序 + 双指针解法
java·算法·leetcode·职场和发展
巴巴_羊18 分钟前
React JSX原理
java
迢迢星万里灬23 分钟前
Java求职者面试指南:微服务技术与源码原理深度解析
java·spring cloud·微服务·dubbo·netty·分布式系统·面试指南
coding随想30 分钟前
*JavaScript 中的反射:用 Reflect 对象掌控对象的“自我认知”
开发语言·javascript·ecmascript
我崽不熬夜35 分钟前
如何让你的Java代码更加优雅且高效?你也许忽视了这些细节!
java·后端·java ee
Pitayafruit39 分钟前
后端开发必看:零代码实现存量服务改造成MCP服务
java·后端·mcp
程序员岳焱40 分钟前
2025年Java全栈开发新趋势深度解析:从技术融合到工程实践
java·人工智能·后端