Lambda 表达式的本质是:把行为(代码)当作参数传递。它让 Java 具备了函数式编程的能力,配合 Stream API 使用,可以写出非常简洁、优雅的代码。

Lambda

Lambda 表达式是 Java 8 引入的核心特性,它允许你以简洁的方式编写匿名函数(没有名字的方法),是函数式编程的基础。

基本语法

(参数列表) -> { 方法体 }
部分说明
(参数列表)可以省略类型,多个参数用逗号分隔
->箭头操作符,分隔参数和方法体
{ 方法体 }单行可省略 {}return
// 无参数
() -> System.out.println("Hello")

// 一个参数(可省略括号)
x -> x * x

// 多个参数
(a, b) -> a + b

// 多行方法体(需要 {} 和 return)
(x, y) -> {
    int sum = x + y;
    return sum * 2;
}

前提:函数式接口

Lambda 表达式只能用于函数式接口——即只有一个抽象方法的接口(可以有多个 default/static 方法)。

@FunctionalInterface
public interface Runnable {
    void run(); // 只有一个抽象方法
}

@FunctionalInterface
public interface Function<T, R> {
    R apply(T t); // 只有一个抽象方法
}

常见使用场景

创建线程

// 传统写法
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello");
    }
}).start();

// Lambda 写法
new Thread(() -> System.out.println("Hello")).start();

Stream 流操作

List<String> names = users.stream()
    .filter(user -> user.getAge() >= 18)  // Predicate<User>
    .map(user -> user.getName())          // Function<User, String>
    .collect(Collectors.toList());

集合遍历

// 传统写法
for (String name : names) {
    System.out.println(name);
}

// Lambda 写法
names.forEach(name -> System.out.println(name));

// 更简洁:方法引用
names.forEach(System.out::println);

排序

List<String> list = Arrays.asList("b", "c", "a");

// 传统写法
Collections.sort(list, new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return a.compareTo(b);
    }
});

// Lambda 写法
Collections.sort(list, (a, b) -> a.compareTo(b));

// 更简洁
list.sort(String::compareTo);

Lambda 与匿名内部类的区别

对比项匿名内部类Lambda 表达式
本质创建一个新类的实例不创建新类,直接指向方法实现
this 指向指向内部类自身指向外部类实例
变量捕获可以修改实例变量只能引用有效 final 的局部变量
性能生成额外的 .class 文件更轻量(通过 invokedynamic 实现)

更多推荐