Java Lambda表达式是Java 8引入的核心特性之一,旨在简化代码编写,提升可读性,尤其在处理函数式接口和集合操作时表现突出。以下是Lambda表达式的关键知识点和用法总结:
1. Lambda表达式基础
-
语法:
(参数列表) -> { 代码块 }
- 单参数可省略括号:
s -> System.out.println(s)
- 单行代码可省略大括号和
return
:(a, b) -> a + b
- 单参数可省略括号:
-
示例:替代匿名内部类
// 匿名内部类 new Thread(new Runnable() { @Override public void run() { System.out.println("Hello"); } }).start(); // Lambda简化 new Thread(() -> System.out.println("Hello")).start();
2. 函数式接口
- 定义:仅含一个抽象方法的接口(可用
@FunctionalInterface
注解标记)。 - 常见内置接口:
Runnable
:无参无返回值 →() -> ...
Comparator<T>
:比较逻辑 →(a, b) -> a.compareTo(b)
Predicate<T>
:条件判断 →s -> s.isEmpty()
Function<T, R>
:类型转换 →s -> s.length()
Consumer<T>
:消费数据 →s -> System.out.println(s)
Supplier<T>
:提供数据 →() -> new ArrayList<>()
3. 方法引用
进一步简化Lambda,通过::
符号引用已有方法:
- 静态方法:
ClassName::staticMethod
- 实例方法:
object::instanceMethod
- 构造方法:
ClassName::new
示例:
List<String> names = Arrays.asList("Alice", "Bob");
names.forEach(System.out::println); // 等价于 s -> System.out.println(s)
4. Lambda在Stream API中的应用
结合Stream
实现声明式集合操作:
List<String> result = list.stream()
.filter(s -> s.startsWith("A")) // Predicate过滤
.map(String::toUpperCase) // Function转换
.sorted((a, b) -> b.compareTo(a)) // Comparator排序
.collect(Collectors.toList()); // 收集结果
5. 作用域与限制
- 访问外部变量:只能读取
final
或等效final
的局部变量。 - 修改外部变量:禁止修改(编译错误)。
this
指向:指向外部类,而非Lambda自身。
6. 自定义函数式接口
@FunctionalInterface
interface StringProcessor {
String process(String input);
}
// 使用Lambda实例化
StringProcessor toUpper = s -> s.toUpperCase();
System.out.println(toUpper.process("hello")); // 输出 "HELLO"
7. 常见错误与注意事项
- 省略
return
和大括号:多行代码需显式使用return
和{}
。 - 类型推断失败:必要时显式声明参数类型,如
(String s) -> ...
。 - 误用非函数式接口:确保接口仅有一个抽象方法。
总结
Lambda表达式通过简化匿名内部类、结合函数式接口和Stream API,极大提升了Java代码的简洁性和可维护性。掌握其核心语法、方法引用及常用函数式接口,能显著优化集合操作、并发编程等场景的代码结构,使程序更优雅高效。