声纳 :将此 lambda 替换为方法引用。什么时候应该使用"stream()"?



我想知道这三段代码之间的区别:

underlyingConnectors.values().stream().forEach(connector -> connector.start());
underlyingConnectors.values().forEach(connector -> connector.start());
underlyingConnectors.values().forEach(Connector::start);

第二行编译得很好,但我的Ecplipse IDE抱怨说";Sonar:将这个lambda替换为方法引用";。

如何选择要使用的适当代码?每一个都有具体的用例吗?

第二个符号只是第一个符号的简写符号,第三个符号是第二个的简写符号。经验法则是,如果一个方法没有像第二个那样的参数,你可以简单地用像第三个那样的符号来替换它。

更一般地,如果lambda表达式右手边(RHS)上的表达式是lambda表达式左手边(LHS)上不需要额外参数的方法调用,或者是只将表达式左手边作为参数的方法呼叫;漂亮的";因为Java目前不支持将方法的currying作为一种语言功能,但可以用包装器代替:

package com.example;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
public class Application {
private static final String LINEBREAK = System.lineSeparator();
public static void main(String[] args) {
final List<String> strings = Arrays.asList("Hello", "World", "!");
strings.forEach(string -> System.out.print(string + LINEBREAK)); // 1
strings.forEach(string -> Application.printWithLineBreakParameter(LINEBREAK).accept(string)); // 2
strings.forEach(Application.printWithLineBreakParameter(LINEBREAK)); // 3
}
private static Consumer<String> printWithLineBreakParameter(final String lineBreak) {
return (string) -> System.out.print(string + lineBreak);
}
}

在这里,所有三个调用都是相等的,但2可以用3代替,使其看起来比1更整洁。

第一行包含对stream()的不必要调用,后两行只是意见问题。如果你想写最短、最简洁的代码,你可以使用最后一个。所有这些都以相同的方式工作,主要是关于风格。

CCD_ 2是不必要的,因为values()返回扩展了已经具有forEach(消费者<?超级T>动作)的IterableCollection

如果您只是通过.forEach()对每个元素执行一个操作,则可以提交.stream()。调用.stream()是多余的。

underlyingConnectors.values().stream().forEach(connector -> connector.start());
underlyingConnectors.values().forEach(connector -> connector.start());

第2行正确。

如果只对每个条目应用一个操作,那么只需使用方法引用,无需编写lambda。这基本上是一种简写。

underlyingConnectors.values().forEach(connector -> connector.start());
underlyingConnectors.values().forEach(Connector::start);

第2行正确。

两行都是正确的。这只是声纳线头的警告。方法引用是lambda的一种简单形式,以防您只返回一个方法。

最新更新