【问题标题】:Using lambda expression in constructor of Timeline object cause error在 Timeline 对象的构造函数中使用 lambda 表达式导致错误
【发布时间】:2017-01-31 13:38:26
【问题描述】:

建议将以下语句更改为 NetBeans 中的 lambda 表达式。

Timeline timeline = new Timeline(new KeyFrame(Duration.millis(5000), new EventHandler() {
            @Override
            public void handle(Event event) {
                //do something
            }
}));

但是,当我应用假定的更改(Alt+Enter)时,我得到了:

Timeline timeline = new Timeline(new KeyFrame(Duration.millis(5000), (Event event) -> {
 //do something
}));

当这不会与消息一起编译时:

没有为 KeyFrame(Duration, (Event) 找到合适的构造函数 eve[...]}}}) - 参数不匹配

问题是为什么 NetBeans 会提出一些它无法实现的建议?以及如何在 Timeline 构造函数中实际使用 lambda 函数? 谢谢。

【问题讨论】:

    标签: java netbeans javafx lambda


    【解决方案1】:

    您调用的KeyFrame constructor 需要EventHandler<ActionEvent>,而不是EventHandler<Event>

    所以你需要

    Timeline timeline = new Timeline(new KeyFrame(Duration.millis(5000), (ActionEvent event) -> {
     //do something
    }));
    

    NetBeans 混淆并插入不正确代码的原因是因为您从事件处理程序匿名内部类的原始类型开始:

    Timeline timeline = new Timeline(new KeyFrame(Duration.millis(5000), new EventHandler() {
                @Override
                public void handle(Event event) {
                    //do something
                }
    }));
    

    (我希望 NetBeans 在这里发出警告,以及使用 lambda 表达式的建议。)

    一般良好的编码习惯会使用正确类型的事件处理程序:

    Timeline timeline = new Timeline(new KeyFrame(Duration.millis(5000), new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    //do something
                }
    }));
    

    在这种情况下,NetBeans 将能够用正确的 lambda 表达式替换它。

    【讨论】:

    • 我觉得有必要指出 IDE 在自动生成 lambda 方面很糟糕。如果它只是写成event -&gt; { /* code */ }(而不是'(ActionEvent event) -> { ... }',这本来就不是问题。
    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2015-09-06
    相关资源
    最近更新 更多