2017-02-20 79 views
2

我剛開始使用SonarQube改善代碼質量,並且在分析使用ControlsFX進行驗證的JavaFx項目時,我得到了這種「代碼異味」錯誤。將ValidationSupport lambda調用轉換爲方法參考

與方法的引用替換此拉姆達:

support.getValidationResult().getErrors().forEach(error -> 
    support.getValidationDecorator().applyValidationDecoration(error)); 

我對如何重構這個因爲ValidationSupport類沒有任何靜態方法不確定,我的IDE是給我這個警告對於大多數就是我搭售做的:

類型ValidationSupport沒有定義 getValidationDecorator(ValidationMessage),這裏是適用

目前我只是把它標記爲Sonar中的一個誤報,但從長遠來看這不是一個很好的解決方案,因爲它隱藏了它。

回答

2

方法引用不必是對靜態方法的引用,它們也可以是對特定對象的方法的引用。在這種情況下,你可以使用:

support.getValidationResult().getErrors().forEach( 
    support.getValidationDecorator()::applyValidationDecoration); 

這是做同樣的事情你原來 - 呼籲applyValidationDecoration與調用support.getValidationDecorator()的結果誤差參數。

+0

完美地工作,謝謝。我的錯誤在於嘗試早期使用「::」,即我的支持:: getValidation。 – Brenin

2

方法引用引入到速記lambda表達式。但只有特定類型的lambda可以使用這些方法引用來縮短。

如果你的lambda除了調用另一個方法之外不做任何事情;你可以使用這個簡短的表單(方法引用)來寫這個lambda。

在你的情況;您的lambda表達式是:

Consumer<Error> con = error -> 
         support.getValidationDecorator().applyValidationDecoration(error); 

你可以看到,error剛剛重定向到applyValidationDecoration方法。 因此;這是使用方法引用的完美有效方案。

support.getValidationResult().getErrors() 
.forEach(support.getValidationDecorator()::applyValidationDecoration); 

看一看的Oracle tutorial,如果您有任何疑問。