Java 在时间线对象的构造函数中使用lambda表达式会导致错误

Java 在时间线对象的构造函数中使用lambda表达式会导致错误,java,netbeans,javafx,lambda,Java,Netbeans,Javafx,Lambda,下面的语句建议在NetBeans中更改为lambda表达式 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() {
            @Override
            public void handle(Event event) {
                //do something
            }
}));
但是,当我应用假定的更改(Alt+Enter)时,我得到:

Timeline timeline = new Timeline(new KeyFrame(Duration.millis(5000), (Event event) -> {
 //do something
}));
当无法使用消息编译时:

未找到关键帧(持续时间,(事件)的合适构造函数 eve[…]})-参数不匹配

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

您正在呼叫的是一个
EventHandler
,而不是
EventHandler

所以你需要

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
            }
}));
Timeline Timeline=new Timeline(新的关键帧(Duration.millis(5000),new EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
//做点什么
}
}));

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

我觉得有必要指出IDE在自动生成lambda方面很糟糕。如果它只是作为
event->{/*code*/}
(而不是“(ActionEvent事件)->{…})编写的,这本来就不会是一个问题。