2016-01-09 68 views
1

我對Java lambda表達式/ lambda語法仍然完全困惑。我讀了lambdas採取兩種一般形式:JavaFX 8如何做一個零參數的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(); 

哪個不行!

我已經嘗試了許多排列,無濟於事。儘管讀了很多關於lambda的頁面和頁面,我仍然無法完全理解它。

我真的很苦惱lambdas。有人能給我一個清楚的解釋,涉及什麼。

回答

2

.setOnFinished()方法採用EventHandler作爲參數(這是一個功能界面)。

它有一個名爲handle()的方法,它接受一個泛型類型,這是您應該考慮參數的方法;所以你必須傳遞一個參數給它。

+1

OH !!! Grrr,這很明顯!我無法看到樹木。 我們調用'.setOnFinished()'!!!並傳遞給它一個lambda。我現在覺得很蠢! – jdurston

+0

lambda可能有點混亂。但是一旦你掌握了它們,它們會讓你的生活變得更容易。 –

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