如何使用Lambda表达式代替匿名内部类实现事件处理?代码举例讲解

Lambda 表达式可以很好地代替匿名内部类实现事件处理。我们来看一个例子:
使用匿名内部类实现事件处理:

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!"));

我们 can 对比两种方式:

  1. 匿名内部类需要实现接口或继承抽象类,并重写方法。Lambda 表达式更简洁,直接实现接口的抽象方法。
  2. 匿名内部类需要指定类型, Lambda 表达式可以根据上下文推断类型。
  3. 匿名内部类需要使用关键字 implements 或 extends, Lambda 表达式无需这些关键字。
  4. Lambda 表达式的参数可以明确指定类型,也可以根据上下文类型推断。匿名内部类的参数类型必须明确指定。
  5. 匿名内部类支持 Exception 列表,Lambda 表达式需要将受检查异常明确抛出。

综上,Lambda 表达式的这些优点使其可以更加简洁有效地实现事件处理,相比匿名内部类来说是一大进步。

但是也要注意,Lambda 表达式有一定的局限性。如果需要的实现较为复杂,Lambda 表达式的简洁性反而不高,这时匿名内部类可能更为合适。所以选择两者要根据具体场景来判断。