Java Lambda 表达式
·
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 实现) |
更多推荐
所有评论(0)