本文将围绕以下四个核心点展开:

  • Lambda 表达式的使用方法

  1. JDK 8 新增的语法形式

  2. 可用 于替代某些匿名内部类对象,从而让代码更简洁,提升可读性

  • 使用时的注意事项

  1. Lambda表单式 只能代替函数式接口的匿名内部类!!!
  • 函数式编程带来的好处与实际用处

  • Lambda 的语法省略规则

  1. 参数类型可省略

  2. 如果一个参数,参数 ()可省略

  3. 如果只有一行执行代码,花括号 {}  <与> 分号 ; <与>  return 语句节课不写,并将代码缩至一行


一、Lambda 表达式是什么?

Lambda 表达式是一种 匿名函数,可以像对象一样传递。它本质上是一个简洁的函数实现方式,用于实现 函数式接口(只包含一个抽象方法的接口)。

基本语法:

(parameters) -> expression
或者
(parameters) -> { statements }

示例:

传统写法:

Runnable r = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello, Lambda!");
    }
};

Lambda 写法:

Runnable r = () -> System.out.println("Hello, Lambda!");

是不是瞬间清爽了很多?


二、Lambda 表达式的使用场景

Lambda 表达式的核心用途是简化匿名内部类的写法,常见于以下场景:

1. 多线程编程(简化 Runnable)

new Thread(() -> System.out.println("线程启动")).start();

2. 集合操作(与 Stream API 配合)

List<String> list = Arrays.asList("A", "B", "C");
list.forEach(s -> System.out.println(s));

3. 自定义函数式接口传参

@FunctionalInterface
interface Calculator {
    int operate(int a, int b);
}

public int compute(int a, int b, Calculator c) {
    return c.operate(a, b);
}

int result = compute(5, 3, (x, y) -> x + y);
System.out.println(result); // 输出:8


三、Lambda 表达式的语法省略规则

Java 提供了一些 Lambda 表达式的 语法糖,可以进一步简化代码:

✅ 参数类型可省略(类型推断):

(x, y) -> x + y

✅ 单个参数时,参数括号可省略:

s -> System.out.println(s)

✅ 方法体只有一行语句时,大括号、return 可省略:

(a, b) -> a + b

✅ 如果有多行语句,必须加大括号和 return:

(x, y) -> {
    System.out.println("计算中...");
    return x + y;
}


四、使用 Lambda 表达式的注意事项

虽然 Lambda 非常强大,但也有一些使用上的 注意点

1. 只能用于函数式接口

Lambda 表达式只能用于只有一个抽象方法的接口,例如 RunnableComparator<T>,或自定义的函数式接口。

多个抽象方法的接口不能用 Lambda 表达式实现。

2. Lambda 内部无法访问非 final 或“实际等于 final” 的局部变量

int x = 10;
Runnable r = () -> System.out.println(x); // OK,因为x未修改
x = 20; // ❌ 编译错误

3. Lambda 无法抛出受检异常(除非接口方法已声明)

@FunctionalInterface
interface ThrowingInterface {
    void run() throws IOException;
}

否则编译器不会通过。


五、Lambda 表达式的好处

✅ 简洁清晰,提升可读性

避免冗长的匿名内部类,代码更加紧凑、直观。

✅ 提升开发效率

减少模板代码,提高开发速度,尤其是在集合遍历、回调等场景。

✅ 解耦逻辑,支持“将行为作为参数”

这为 Java 引入了类似函数式语言的编程模式(高阶函数),便于构建灵活的业务逻辑。

✅ 与 Stream API 天作之合

配合 Stream 使用,可实现函数式数据处理管道:

List<String> list = Arrays.asList("apple", "banana", "cherry");
list.stream()
    .filter(s -> s.startsWith("b"))
    .map(String::toUpperCase)
    .forEach(System.out::println);

六、总结

项目 内容说明
使用对象 函数式接口(如 Runnable、Comparator、自定义)
使用场景 回调、事件处理、集合操作、并发任务等
Lambda 好处 简洁高效、可读性好、支持行为参数化
注意事项 变量必须“等于 final”,仅适用于函数式接口等
常用搭配 Stream、Optional、CompletableFuture、函数接口等


写在最后

Lambda 表达式不只是语法糖,它是 Java 函数式编程的入口。通过合理使用 Lambda,我们可以编写出更现代、更简洁、更高效的 Java 代码。

建议大家在日常开发中多多练习,尤其是在 Stream 流操作、回调接口实现中,尝试用 Lambda 表达式替代冗长的匿名类,你会发现 Java 原来也可以很优雅。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐