我想知道这两段代码有什么区别:
underlyingConnectors.values().stream().forEach(connector -> connector.start());
underlyingConnectors.values().forEach(connector -> connector.start());
underlyingConnectors.values().forEach(Connector::start);
第二行编译得很好,但我的 Ecplipse IDE 抱怨“声纳:用方法引用替换这个 lambda”。
如何选择要使用的适当代码?这些都有具体的用例吗?
如果你只是通过 .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行是正确的。
第一行包含对stream()
的不必要调用,后面的两个是见仁见智的问题。如果您想编写最短、最简洁的代码,您可以使用最后一个。所有这些都以等效的方式工作,主要是关于样式。
stream()
是不必要的,因为values()
返回一个Collection
,它扩展了具有forEach(Consumer
第二个简单地是第一个的速记符号,第三个是第二个的速记符号。经验法则是,如果一个方法没有像第二个一样的参数,你可以简单地用像第三个一样的符号替换它。
更一般地说,如果lambda表达式右侧(RHS)的表达式是lambda表达式左侧(LHS)的方法调用,不需要额外的参数,或者是只接受表达式左侧作为参数的方法调用,那么lambda表达式可以替换为方法引用-一旦RHS接受两个参数,它就不像Java那样“漂亮”,目前不支持方法的柯里化作为语言特性,但可以替换为包装器:
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更简洁。
当我在sonar中检查时,结果是: 它实际上指的是: 我的代码如下所示: 我试图改变它,但我得到了一个错误。有人知道如何改变它吗?
索纳尔曲贝的解释是: 方法/构造函数引用比使用lambdas更紧凑、更易读,因此是首选。
问题内容: 最近,我在WeakReferences中遇到了一段Java代码- 尽管在引入它们时会遇到它们,但我从未见过部署它们。这是应该常规使用的还是仅在遇到内存问题时才使用的东西?如果是后者,是否可以轻松地对其进行改造,或者代码需要进行认真的重构?一般的Java(或C#)程序员通常可以忽略它们吗? 编辑 过度热情地使用WR会造成任何损害吗? 问题答案: 弱引用都是关于垃圾回收的。一个 标准的 对
问题内容: 我知道他们两个都禁用了Nagle的算法。 我什么时候应该/不应该使用它们中的每一个? 问题答案: 首先,不是所有人都禁用Nagle的算法。 Nagle的算法用于减少有线中更多的小型网络数据包。该算法是:如果数据小于限制(通常是MSS),请等待直到收到先前发送的数据包的ACK,同时累积用户的数据。然后发送累积的数据。 这将对telnet等应用程序有所帮助。但是,在发送流数据时,等待A
问题内容: 在该类中,有两个字符串,和。 有什么不同?我什么时候应该使用另一个? 问题答案: 如果你的意思是和则: 用于在文件路径列表中分隔各个文件路径。考虑在上的环境变量。您使用a分隔文件路径,因此在上将是;。 是或用于拆分到特定文件的路径。例如在上,或
问题内容: 代替在所有地方使用是否合法?为什么从Python 3中删除?似乎是一种了不起的,有用的方法。它背后的原因是什么? 编辑: 为澄清起见,我想知道以类似于生成器的方式(一次将一项,而不是全部都存储到内存中)以与Python 2和Python 3兼容的方式遍历字典的正确习惯是什么。 ? 问题答案: 在Python 2.x中-返回(键,值)对的列表。在Python 3.x中,现在是一个对象,其