当前位置: 首页 > 面试题库 >

声纳:将此lambda替换为方法参考

萧晓博
2023-03-14
问题内容

此代码示例

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,它具有诸如andThenand / or 这样的方法compose。但是,Java
8的工作方式要求将第一个方法引用转换为目标接口以调用合并方法,而这将很难理解您现在拥有的lambda表达式:类型((Function<X,Y>)getValueProvider()::apply).andThen(Y::getValue)在哪里Yapply(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替换的声纳信息。但我必须调用字符串上的方法引用???