题目
Java 8 中 Lambda 表达式的基本使用
信息
- 类型:问答
- 难度:⭐
考点
Lambda表达式,函数式接口,语法基础
快速回答
Lambda表达式是Java 8引入的匿名函数,用于简化函数式接口的实现。主要特点:
- 使用箭头符号
->分隔参数和函数体 - 可替代匿名内部类
- 基本语法:
(parameters) -> expression或(parameters) -> { statements; } - 示例:
Runnable r = () -> System.out.println("Hello Lambda");
原理说明
Lambda表达式基于函数式接口(只有一个抽象方法的接口),编译器会自动推断类型。它实质上是实现了函数式接口的匿名类实例,但语法更简洁。
代码示例
// 传统匿名内部类
Runnable oldRunnable = new Runnable() {
@Override
public void run() {
System.out.println("Old way");
}
};
// Lambda表达式实现
Runnable lambdaRunnable = () -> System.out.println("Lambda way");
// 带参数的Lambda
Comparator<String> comparator = (s1, s2) -> s1.compareToIgnoreCase(s2);
// 多行代码块
Runnable multiLine = () -> {
System.out.println("Line 1");
System.out.println("Line 2");
};最佳实践
- 优先使用内置函数式接口(如
Runnable,Comparator,Consumer) - 单行表达式可省略
{}和return关键字 - 类型推断:当参数类型明确时可省略类型声明
- 配合Stream API使用效果更佳
常见错误
- 在非函数式接口上使用Lambda(接口有多个抽象方法)
- 试图修改Lambda外部的非final局部变量
- 混淆Lambda参数与实例变量命名
- 错误示例:
int x = 10; Runnable r = () -> x++; // 编译错误
扩展知识
- 方法引用:进一步简化Lambda,如
System.out::println - 变量捕获:Lambda可访问
final或等效final的局部变量 - 函数式接口包:
java.util.function提供Predicate,Function等常用接口 - 与匿名类的区别:Lambda没有自己的作用域,
this指向外部类