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);