JavaFX 8如何使用零参数执行lambda表达式

时间:2016-01-09 20:52:10

标签: java lambda closures javafx-8

我仍然对Java lambdas / lambda语法感到困惑。我读到lambdas有两种一般形式:

(param1, param2, ...) -> expression;

(param1, param2, ...) -> { /* code statements */ };
好的,好的。并且当表达式不接受参数(并且被称为空)时,仍然需要括号。

现在,以下代码正常运行:

primaryStage.show();
PauseTransition pause =
    new PauseTransition(Duration.seconds(3));
pause.setOnFinished(event ->
    primaryStage.hide());
pause.play();

但是,当我认为primaryStage.hide()不需要任何参数时,我想我可以从lambda表达式中删除参数。这(遵守保留括号的规则)给出了以下代码:

primaryStage.show();
PauseTransition pause =
    new PauseTransition(Duration.seconds(3));
pause.setOnFinished(() ->
    primaryStage.hide());
pause.play();

哪个不起作用!!!

我尝试了许多排列,但无济于事。尽管仔细研究了关于lambdas的页面和页面,我仍然无法直接理解它。

我真的在与lambdas斗争。有人可以给我一个明确解释所涉及的内容。

2 个答案:

答案 0 :(得分:2)

.setOnFinished()方法将EventHandler作为参数(这是一个功能接口)。

它有一个名为handle()的方法,它接受泛型类型,这是你应该考虑其参数的方法;所以你必须传递一个参数。

答案 1 :(得分:1)

如果你的lambda实现的方法有一个参数,你的参数列表中必须有一个参数,即使你不使用它。你表示event -> primaryStage.hide()有效,所以你必须用参数实现一个方法。

这就像你实际使用匿名类实现该接口一样:

new Consumer<Event>() {
  @Override public void accept(Event event) { // can't omit the argument!
    primaryStage.hide(); // doesn't use the argument
  }
}