Java 声纳:用方法引用替换此lambda

Java 声纳:用方法引用替换此lambda,java,lambda,java-8,sonarqube,Java,Lambda,Java 8,Sonarqube,此代码示例 Collection<Number> values = transform( getValuatedObjects(), input -> getValueProvider().apply(input).getValue()); 集合值=转换( GetValuedObject(), 输入->getValueProvider().apply(输入).getValue()); 违反以下规定: 如果可能,用方法引用替换lambdas 是

此代码示例

Collection<Number> values = transform(
        getValuatedObjects(),
        input -> getValueProvider().apply(input).getValue());
集合值=转换(
GetValuedObject(),
输入->getValueProvider().apply(输入).getValue());
违反以下规定:

如果可能,用方法引用替换lambdas

是声纳虫吗?
或者我真的可以使用方法引用吗?

在不更改语义的情况下,不能用方法引用替换lambda
input->getValueProvider().apply(input).getValue()

方法引用替换单个方法调用,因此它不能简单地替换由多个方法调用组成的lambda表达式

格式为
input->getValueProvider().apply(input)
的lambda表达式可以替换为
getValueProvider()::apply
当且仅当
getValueProvider()的计算时间
并不重要,因为在lambda表单中,方法在每个lambda主体求值时被调用,而对于方法引用,它只被调用一次,并且结果被捕获

这类似于
x->System.out.println(x)
System.out::println
之间的区别,其中读取字段
System.out
的内容发生在不同的时间,但通常并不重要。但你应该意识到其中的区别

在您的示例中,调用了第三个方法
getValue()
。用方法引用表示的唯一方法需要像
Function
这样的函数接口,该接口具有像
这样的方法,然后是
和/或
compose
。但是,按照Java8的工作方式,需要将第一个方法引用强制转换到目标接口,以调用组合方法,而现在使用的lambda表达式:
((函数)getValueProvider()::apply)。然后(Y::getValue)
其中
Y
是类型,
apply(输入)
返回


注意,规则说“如果可能的话,用方法引用替换lambda”,这给了你空间说“好吧,这里不可能”,但是,我不确定你能称它为“规则”多少,那么…

如果你用java 8编码,你可以用方法引用代替lambda表达式来实现代码可读性

List<Integer> list = Arrays.asList(1,2,3,4,5);
替换

strList.stream().sorted().collect(Collectors.toList()).forEach(System.out::println);
list.stream().sorted().collect(collector.toList()).forEach(元素-> 操作(元素))

用方法引用替换上述lambda

list.stream().sorted().collect(Collectors.toList()).forEach(this::operate)


如果你能发布更多的代码,这会更容易…谢谢你的回答。所以我们可以说这是一个声纳错误。嗨,我确认这确实是一个假阳性。已创建票证以更正此问题:更新问题的旧链接:
strList.stream().sorted().collect(Collectors.toList()).forEach(System.out::println);