Java Lambda 表达式是Java 8 引入的一项重要特性,旨在简化代码编写,提高可读性,尤其是在 函数式编程 场景下表现突出。它本质上是对 匿名内部类 的简化,使得代码更加紧凑、可维护。
1. Lambda 表达式的基本语法
Lambda 表达式的基本格式如下:
(参数列表) -> { 方法体 }
语法要点
参数列表
:可以有 0~多个参数,如果只有 一个参数,可以 省略小括号()
->
符号:Lambda 操作符方法体
:- 如果 只有一行代码,可以 省略大括号
{}
和return
关键字 - 如果有 多行代码,必须使用
{}
包裹代码块
- 如果 只有一行代码,可以 省略大括号
2. Lambda 表达式的示例
(1)无参数,无返回值
传统写法(匿名内部类):
Study study = new Study() {
@Override
public void study() {
System.out.println("我是学习方法!");
}
};
study.study();
Lambda 表达式:
Study study = () -> System.out.println("我是学习方法!");
study.study();
简化点:省略
new Study()
,减少@Override
以及方法名称,使代码更加紧凑。
(2)有参数,无返回值
传统写法:
Study study = new Study() {
@Override
public void study(int hours) {
System.out.println("今天学习了" + hours + "小时");
}
};
study.study(5);
Lambda 表达式:
Study study = (hours) -> System.out.println("今天学习了" + hours + "小时");
study.study(5);
简化点:
- 省略
new Study()
- 省略
@Override
- 省略方法名称
如果 只有一个参数,()
也可以省略:
Study study = hours -> System.out.println("今天学习了" + hours + "小时");
study.study(5);
(3)有参数,有返回值
传统写法:
Study study = new Study() {
@Override
public String study(int hours) {
return "今天学习了" + hours + "小时";
}
};
System.out.println(study.study(5));
Lambda 表达式:
Study study = (hours) -> {
return "今天学习了" + hours + "小时";
};
System.out.println(study.study(5));
简化点:省略
new Study()
,减少@Override
以及方法名称
如果 只有一个 return
语句,可以省略 {}
和 return
:
Study study = hours -> "今天学习了" + hours + "小时";
System.out.println(study.study(5));
3. Lambda 表达式与函数式接口
Lambda 表达式的核心概念之一是 “函数式接口”,它是 只有一个抽象方法 的接口。
(1)定义函数式接口
@FunctionalInterface
interface Study {
void study();
}
@FunctionalInterface
作用:
- 限制 只能有一个抽象方法,否则编译报错
- 提高可读性,让开发者知道这个接口用于 Lambda 表达式
(2)Lambda 表达式与函数式接口结合
public static void main(String[] args) {
Study study = () -> System.out.println("Lambda 实现学习方法");
study.study();
}
4. 方法引用(Lambda 的进一步简化)
如果 Lambda 体内的代码 直接调用了某个已存在的方法,可以使用 方法引用。
(1)静态方法引用
public class Main {
public static void printMessage(String message) {
System.out.println(message);
}
public static void main(String[] args) {
Consumer<String> consumer = Main::printMessage;
consumer.accept("方法引用示例");
}
}
Main::printMessage
代替message -> Main.printMessage(message)
(2)实例方法引用
public class Main {
public void print(String msg) {
System.out.println(msg);
}
public static void main(String[] args) {
Main obj = new Main();
Consumer<String> consumer = obj::print;
consumer.accept("实例方法引用示例");
}
}
obj::print
代替msg -> obj.print(msg)
(3)构造方法引用
Supplier<List<String>> supplier = ArrayList::new;
List<String> list = supplier.get();
ArrayList::new
代替() -> new ArrayList<>()
5. Lambda 在 Java API 中的应用
Java 8 之后,许多 API 都支持 Lambda 表达式,例如 集合操作:
List<String> list = Arrays.asList("A", "B", "C");
// 传统写法
for (String s : list) {
System.out.println(s);
}
// Lambda
list.forEach(s -> System.out.println(s));
// 方法引用
list.forEach(System.out::println);
list.forEach(System.out::println);
进一步简化s -> System.out.println(s);
6. Lambda 与 Stream API
Lambda 常用于 Stream API,例如:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 过滤偶数
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(evenNumbers);
filter(n -> n % 2 == 0)
代替 传统for
循环,提高代码可读性
7. Lambda 表达式的优缺点
✅ 优点
- 代码简洁:去掉
new
、@Override
、方法名,使代码更加紧凑 - 提高可读性:减少 样板代码,更容易理解
- 增强可维护性:代码更清晰、直观,减少 Bug 产生的可能性
- 高效流处理:结合
Stream API
,简化集合操作
❌ 缺点
- 调试难度大:Lambda 表达式省略了方法名,难以调试
- 阅读成本高:初学者不熟悉语法时,可能觉得代码更难理解
- 不适用于复杂逻辑:如果方法体内逻辑较复杂,Lambda 反而 降低可读性
总结
Lambda 表达式是 Java 8 之后的重要特性,可以大幅简化代码,使代码更简洁、可读性更高。
但它 并不适用于所有场景,尤其在复杂逻辑下,仍然推荐使用普通方法或类。
👉 如果你想深入学习 Lambda,可参考:
💡 问题思考:
- 你是否在项目中用过 Lambda?哪些场景最适合?
- Lambda 和匿名内部类在实际开发中如何权衡?
🚀 欢迎在评论区分享你的想法! 🎯