将 ValidationSupport lambda 调用转换为方法引用

Converting ValidationSupport lambda call to method reference

我刚开始使用 SonarQube 来提高我的代码质量,当我分析一个使用 ControlsFX 进行验证的 JavaFx 项目时,我遇到了这个 "code smell" 错误。

Replace this lambda with a method reference:

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

我不确定如何重构它,因为 ValidationSupport class 没有任何静态方法,而我的 IDE 对我想做的大部分事情都发出警告:

The type ValidationSupport does not define getValidationDecorator(ValidationMessage) that is applicable here

目前我只是在 Sonar 中将其标记为误报,但从长远来看这不是一个好的解决方案 运行 因为它只是隐藏了它。

方法引用不必是对静态方法的引用,它们也可以是对特定对象上的方法的引用。在这种情况下,您可以使用:

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

这与您的原始操作完全相同 - 在调用 support.getValidationDecorator().

的结果中使用错误参数调用 applyValidationDecoration

方法引用 引入了 shorthand lambda 表达式。但是只有特定类型的 lambda 可以 shorthanded 使用这些方法引用。

如果你的 lambda 除了调用另一个方法之外什么都不做;您可以使用这种简短形式(方法引用)来编写 lambda。

在你的情况下;您的 lambda 表达式是:

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

您可以看到 error 刚刚重定向到 applyValidationDecoration 方法。 因此;这是使用方法引用的完全有效的场景。

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

如果您有任何疑问,请查看 Oracle tutorial