gon*_*ard 20 lambda java-8 sonarqube
这段代码示例
Collection<Number> values = transform(
getValuatedObjects(),
input -> getValueProvider().apply(input).getValue());
Run Code Online (Sandbox Code Playgroud)
违反了声纳规则:
尽可能用方法引用替换lambdas
它是声纳虫吗?或者我真的可以使用方法参考吗?
Hol*_*ger 32
您无法在input -> getValueProvider().apply(input).getValue()不更改语义的情况下使用方法引用替换lambda .
方法引用替换单个方法调用,因此它不能简单地替换由多个方法调用组成的lambda表达式.
表单的lambda表达式input -> getValueProvider().apply(input)可以替换为getValueProvider()::applyif,并且只有当评估时间getValueProvider()与lambda形式无关时,方法在每个lambda body评估上被调用,而对于方法引用,它仅被调用一次并且结果抓获.
这类似于之间的区别x -> System.out.println(x),并System.out::println在那里读字段的内容System.out在不同的时间发生,但通常也没关系.但你应该意识到差异.
在您的示例中,getValue()调用第三个方法.使用方法引用表达它的唯一方法需要一个功能接口Function,其中包含类似andThen和/或方法compose.但是,Java 8的工作方式,需要将第一个方法引用转换为目标接口来调用组合方法,这种方法更容易读取你现在拥有的lambda表达式:((Function<X,Y>)getValueProvider()::apply).andThen(Y::getValue)where 返回Y类型apply(input).
请注意,该规则说" 在可能的情况下用方法引用替换lambda ",这给了你一个说"好吧,这里不可能"的空间,但是,我不知道你可以称之为"规则"多少......
Aka*_*ore 10
list.stream().sorted().collect(Collectors.toList()).forEach(element -> opera(element));
将上面的 lambda 替换为方法引用。
list.stream().sorted().collect(Collectors.toList()).forEach(this::operate);
小智 6
如果您使用 java 8 进行编码,您可以使用方法引用代替 lambda 表达式,以使代码可读
List<Integer> list = Arrays.asList(1,2,3,4,5);
Run Code Online (Sandbox Code Playgroud)
将此 lambda 替换为方法引用
strList.stream().sorted().collect(Collectors.toList()).forEach(s -> System.out.println(s));
Run Code Online (Sandbox Code Playgroud)
代替
strList.stream().sorted().collect(Collectors.toList()).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)