Lambda表达式和匿名内部类有什么不同?

Java Lambda表达式和匿名内部类(Anonymous Inner Class)都是用来创建匿名函数的,但它们有以下主要区别:

  1. 语法上更简洁。Lambda表达式的语法更简洁,只包含参数列表,箭头和函数体,而匿名内部类需要定义类声明与方法实现,较之Lambda表达式冗长。
  2. 强大的类型推断。Lambda表达式支持强大的类型推断,不需要指定类型,而匿名内部类需要指定接口实现的类型。
  3. 捕获变量的值。Lambda表达式可以捕获定义它的作用域中的局部变量,并且即使变量生命周期结束,Lambda表达式也可以正常使用它的值。匿名内部类不能直接访问外围作用域的局部变量,需要将其定义为final类型。
  4. 方法数量。Lambda表达式只能包含一个方法,而匿名内部类可以包含多个方法。
  5. 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!"));