【问题标题】:How to write lambda expression with EventHandler javafx如何使用 EventHandler javafx 编写 lambda 表达式
【发布时间】:2017-07-25 14:19:01
【问题描述】:

我正在尝试重写这段代码

new EventHandler<MouseEvent>() {

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

作为

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

我得到错误。我的错误是什么?

【问题讨论】:

  • 第一个代码块的 lambda 等效项只是 event -&gt; System.out.println(event.hashCode()) (没有调用构造函数,我认为这是你想要做的)。
  • 简单来说,用 lambda 替换的是整个 functional interface,而不是接口中的函数。你的第一个代码 sn-p 的 lambda 等效项是 event -&gt; System.out.println(e.hashCode())。您所做的基本上是在构造函数中添加“lambda”。无效
  • @Pascal Hoffenheimer 如果答案让您满意,您可以接受,这就是论坛的运作方式,如果您不这样做,有相同问题的人将不会看到解决方案,因为帖子会出现作为“未解决”
  • 我理解我的错误: 1. 构造函数被排除在外。 2.使用参数名称。不要重命名。

标签: java javafx lambda expression eventhandler


【解决方案1】:

lambda 表达式在这里替换整个FunctionalInterface 而不仅仅是它的方法,所以它不是constructor + lambda 而只是lambda

  1. 使用EventHandler 作为参数:

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

    变成

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

  1. 在变量中使用EventHandler

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

    它会变成:

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


它存在多种使用 lambda 的方式,带或不带参数,例如:

Runnable r = () -> System.out.println("Here");

【讨论】:

  • 假设我根本不打算使用 event 参数,有什么方法可以删除它或 Kotlin 中的任何特殊变量名 (_)?
  • @mahemadhi 在这种情况下不是,因为EventHandler 的方法确实有一个参数,但是对于 Supplier/Runnable/... 你可以(见编辑)
  • 很抱歉让您感到困惑.. 这只是另一个问题
猜你喜欢
  • 1970-01-01
  • 2016-07-01
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
  • 2012-10-24
  • 2021-09-06
  • 1970-01-01
  • 2010-11-07
相关资源
最近更新 更多