java - 使用 Java 8 流时的新对象实例化

标签 java lambda java-8 java-stream method-reference

除了后者的可读性稍好之外,使用以下构造有什么不同吗?

someList.stream().map(item -> new NewClass(item)).collect(Collectors.toList());

someList.stream().map(NewClass::new).collect(Collectors.toList());

最佳答案

通常没有区别。 NewClass::new 产生更少的字节码,因为在 lambda 版本中,自动生成的私有(private)方法由 java 编译器从 lambda 主体创建,而 NewClass:new 直接链接到构造函数方法处理。因此,使用方法引用您的类文件大小可能会稍微小一些。但预计不会有显着的性能差异。

另一个区别是方法解析过程。它不适用于您的特定示例,但可能适用于其他代码。例如,你有两个构造函数:

public NewClass(String a) {...}
public NewClass(String a, String b) {...}

你有一些接受功能接口(interface)的方法:

public myMethod(Function<String, NewClass> fn) {...}

然后你可以用 lambda 或函数式接口(interface)调用它:

myMethod(str -> new NewClass(str));
myMethod(NewClass::new);

但假设稍后您添加一个具有相同名称的新方法,如下所示:

public myMethod(BiFunction<String, String, NewClass> fn) {...}

然后方法引用调用将变得不明确并导致编译错误,因为 NewClass::new 现在匹配两个构造函数,而 lambda 仍然是明确的。

关于java - 使用 Java 8 流时的新对象实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31763930/

相关文章:

java - 在 Spring Web MVC 中下载或重定向错误消息到另一个 Controller 操作

Java求助Decimal format cannot be resolved to a type

c++ - 嵌套的 lambda 函数

java - Eclipse - Java - 解析 android-23 的数据失败

Java 8 : Reference to [method] is ambiguous

java - 有没有办法在 Tomcat 9 中部署 jar 而不重新启动?

java - 在 Android 上使用 WebRTC 实现 Kurento 客户端

c++ - 根据多个条件对结构进行排序?

java - map 流到 map

java - 使用 java8 流构建集合