如何使用EventHandler javafx编写lambda表达式

3

我正在尝试重写这段代码

new EventHandler<MouseEvent>() {

    @Override
    public void handle(MouseEvent e) {
        System.out.println(e.hashCode());
    }
};

as

new EventHandler<MouseEvent>(e -> System.out.println(e.hashCode()));

我遇到了错误。这里我的错误是什么?


3
第一个代码块的lambda表达式等价于event -> System.out.println(event.hashCode())(不包括构造函数的调用,我认为这是你尝试做的)。 - James_D
简单来说,它是您用lambda替换整个“功能接口”,而不是接口内的函数。你第一个代码片段的lambda等价物是event -> System.out.println(e.hashCode())。您正在做的基本上是在构造函数中添加“lambda”。无效。 - Dota2
@Pascal Hoffenheimer 如果答案能够满足您的需求,您可以接受它,这是论坛的运作方式。如果您没有接受,那么有相同问题的人将不会看到解决方案,因为该帖子将显示为“未解决”。 - azro
我明白我的错误:
  1. 构造函数应该省略。
  2. 使用参数名称,不要重命名它。
- Pascal Hoffenheimer
1个回答

7

lambda表达式是用来替代整个FunctionalInterface而不仅仅是其中的方法,所以它不是构造函数 + lambda而只是lambda

  1. Use the EventHandler as parameter :

    someNode.addEventHandler(MouseEvent.MOUSE_CLICKED, 
                            new EventHandler<MouseEvent>() {
                               @Override
                               public void handle(MouseEvent event) {
                                  System.out.println(event.hashCode());
                               }
                            });
    

    Becomes :

     someNode.addEventHandler(MouseEvent.MOUSE_CLICKED, 
                              event ->  System.out.println(event.hashCode()));
    

  1. Use the EventHandler in a variable :

    EventHandler<MouseEvent> eh = new EventHandler<MouseEvent>() {
                                       @Override
                                       public void handle(MouseEvent event) {
                                           System.out.println(event.hashCode());
                                       }
                                };
    

    It'll become :

    EventHandler<MouseEvent> eh = e -> System.out.println(e.hashCode());
    
存在多种使用lambda的方式,可以带参数或不带参数,例如:
Runnable r = () -> System.out.println("Here");

假设我根本不会使用事件参数,有没有办法可以将其删除或者像 Kotlin 中一样使用特殊变量名(_)? - Mahendran
@mahemadhi 在这种情况下不是这样的,因为EventHandler方法确实有一个参数,但对于Supplier/Runnable/...您可以(请参见编辑)。 - azro
很抱歉让你感到困惑。这只是另一个问题。 - Mahendran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接