Java中的Lambda表达式是JDK8新增的核心特性之一,它允许开发者以更简洁的方式实现函数式接口,减少冗余的匿名内部类代码,让Java代码更符合函数式编程的风格。Lambda表达式的本质是对函数式接口的匿名实现,因此要掌握Lambda表达式的使用,首先需要理解函数式接口的定义。

什么是函数式接口
函数式接口指的是只有一个抽象方法的接口,Java中专门提供了@FunctionalInterface注解来标识这类接口,使用该注解后,编译器会检查接口是否符合函数式接口的定义,如果接口中有多个抽象方法,编译时就会报错。
常见的函数式接口有Runnable、Comparator等,我们也可以自定义函数式接口。下面是一个自定义函数式接口的示例:
// 使用@FunctionalInterface注解标识函数式接口
@FunctionalInterface
interface Calculator {
// 唯一的抽象方法,接收两个int参数,返回int结果
int calculate(int a, int b);
}
需要注意的是,函数式接口中可以有默认方法(default修饰)和静态方法,这些方法不影响接口的函数式接口属性,只要抽象方法只有一个即可。
Lambda表达式的基本语法
Lambda表达式用来简化函数式接口的实现,基本语法格式如下:
(参数列表) -> { 方法体 }
语法说明:
- 参数列表:对应函数式接口中抽象方法的参数,如果参数类型可以推导出来,可以省略参数类型;如果只有一个参数,还可以省略括号。
- ->:Lambda运算符,用来分隔参数列表和方法体。
- 方法体:对应抽象方法的实现逻辑,如果方法体只有一行代码,可以省略大括号和
return关键字(如果有返回值的话)。
Lambda表达式与函数式接口的结合使用
我们可以使用Lambda表达式来实现之前定义的Calculator接口,对比传统匿名内部类的写法,可以看到Lambda表达式的简洁性。
传统匿名内部类实现
// 匿名内部类实现Calculator接口,实现加法逻辑
Calculator addCalculator = new Calculator() {
@Override
public int calculate(int a, int b) {
return a + b;
}
};
System.out.println(addCalculator.calculate(3, 5)); // 输出8
Lambda表达式实现
// Lambda表达式实现加法逻辑,省略参数类型、大括号和return Calculator addCalculator = (a, b) -> a + b; System.out.println(addCalculator.calculate(3, 5)); // 输出8 // 实现减法逻辑 Calculator subCalculator = (a, b) -> a - b; System.out.println(subCalculator.calculate(10, 4)); // 输出6
常见的函数式接口使用示例
Java内置了很多实用的函数式接口,下面以Runnable和Comparator为例演示Lambda表达式的使用。
Runnable接口的使用
Runnable接口是典型的函数式接口,只有一个run抽象方法,传统写法需要创建匿名内部类,使用Lambda表达式后可以简化代码:
// 传统匿名内部类写法
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程执行");
}
}).start();
// Lambda表达式写法
new Thread(() -> System.out.println("线程执行")).start();
Comparator接口的使用
Comparator接口的compare方法用来比较两个对象,使用Lambda表达式可以快速实现排序逻辑:
import java.util.Arrays;
import java.util.Comparator;
public class Test {
public static void main(String[] args) {
String[] arr = {"apple", "banana", "cherry"};
// Lambda表达式实现按字符串长度排序
Comparator<String> comparator = (s1, s2) -> s1.length() - s2.length();
Arrays.sort(arr, comparator);
System.out.println(Arrays.toString(arr)); // 输出[apple, banana, cherry]
}
}
注意事项
- Lambda表达式只能用于函数式接口的实现,不能用于普通接口。
- Lambda表达式中访问的局部变量默认是
final的,不能再修改,否则会编译报错。 - 如果方法体比较复杂,建议还是使用大括号包裹代码,保证可读性。