Java Lambda表达式和匿名内部类(Anonymous Inner Class)都是用来创建匿名函数的,但它们有以下主要区别:
- 语法上更简洁。Lambda表达式的语法更简洁,只包含参数列表,箭头和函数体,而匿名内部类需要定义类声明与方法实现,较之Lambda表达式冗长。
- 强大的类型推断。Lambda表达式支持强大的类型推断,不需要指定类型,而匿名内部类需要指定接口实现的类型。
- 捕获变量的值。Lambda表达式可以捕获定义它的作用域中的局部变量,并且即使变量生命周期结束,Lambda表达式也可以正常使用它的值。匿名内部类不能直接访问外围作用域的局部变量,需要将其定义为final类型。
- 方法数量。Lambda表达式只能包含一个方法,而匿名内部类可以包含多个方法。
- this和super。Lambda表达式没有this和super,而匿名内部类有。
举例来比较:
匿名内部类:
MathOperation add = new MathOperation() {
@Override
public int operate(int a, int b) {
return a + b;
}
};
Lambda表达式:
MathOperation add = (x, y) -> x + y;
匿名内部类:
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Button clicked!");
}
});
Lambda表达式:
button.setOnAction(event -> System.out.println("Button clicked!"));