此代码示例
Collection<Number> values = transform(
getValuatedObjects(),
input -> getValueProvider().apply(input).getValue());
违反了声纳法规则:
尽可能用方法引用替换lambda
是声纳虫吗?还是我真的可以使用方法参考?
您不能在input -> getValueProvider().apply(input).getValue()
不更改语义的情况下用方法引用替换lambda 。
方法引用替换 单个 方法调用,因此它不能简单地替换包含多个方法调用的lambda表达式。
形式的lambda表达式input -> getValueProvider().apply(input)
可以被替换为,getValueProvider()::apply
当且仅当的评估时间getValueProvider()
无关紧要,因为在lambda形式中,在每个lambda主体评估中都调用该方法,而对于方法引用,仅调用一次,并且结果被抓
这类似于之间的区别x -> System.out.println(x)
,并System.out::println
在那里读字段的内容System.out
在不同的时间发生,但通常并不重要。但是您应该意识到区别。
在您的示例中,getValue()
调用了第三个方法。用方法引用来表示的唯一方法是需要一个功能接口,例如like
Function
,它具有诸如andThen
and / or 这样的方法compose
。但是,Java
8的工作方式要求将第一个方法引用转换为目标接口以调用合并方法,而这将很难理解您现在拥有的lambda表达式:类型((Function<X,Y>)getValueProvider()::apply).andThen(Y::getValue)
在哪里Y
,apply(input)
返回。
请注意,该规则说“ 在可能的情况下 用方法引用替换lambda ”,这使您有空间说“嗯,在这里是不可能的”,但是,我不确定您可以称其为“规则”多少……
我编写了代码,从包含日期变量的对象列表中查找最新日期。 <代码>列表。流()。地图(段- 但我发现声纳问题 将此lambda替换为方法引用“Objects::nonNull”。 我无法弄清楚的是,我可以在哪里使用声纳lint问题所述的方法参考。
我有一个包含错误列表的集合。我想通过一个键(UUID UserId)对它们进行分组。为此,我从以下答案中复制了代码:https://stackoverflow.com/a/30202075/4045364 Sonar Lint告诉我以下错误: 用方法引用替换此lambda<代码>- 我所尝试的: 基于这些问题:SONAR:用方法引用替换此lambda,可运行接口:用方法引用替换此lambda。(未
当我在sonar中检查时,结果是: 它实际上指的是: 我的代码如下所示: 我试图改变它,但我得到了一个错误。有人知道如何改变它吗?
索纳尔曲贝的解释是: 方法/构造函数引用比使用lambdas更紧凑、更易读,因此是首选。
在此代码中,我有以下警告: 用方法引用替换此lambda。 我不知道如何解决这个错误,因为它在forEach中,在map中,我可以使用,但在这里,我不能。 有什么想法吗?
我通过方法参考获得了关于用lambda替换的声纳信息。但我必须调用字符串上的方法引用???