有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JavaFX 8如何使用零参数实现lambda表达式

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

(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();

这不管用

我尝试了很多排列,但都没有用。尽管我一页又一页地钻研着兰博达斯,但我仍然无法在脑海中完全理解它

我真的很难对付兰博达斯。有人能给我一个清楚的解释吗


共 (2) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

    如果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
      }
    }