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

She*_*gon 40 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());
Run Code Online (Sandbox Code Playgroud)

Tag*_*eev 46

一般来说没有区别.NewClass::new产生较少的字节码,如在lambda版本中,自动生成的私有方法由java编译器从lambda主体创建,同时NewClass:new直接链接到构造方法方法句柄.因此,使用方法引用可能会略微减少类文件的大小.但预计不会出现明显的性能差异.

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

public NewClass(String a) {...}
public NewClass(String a, String b) {...}
Run Code Online (Sandbox Code Playgroud)

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

public myMethod(Function<String, NewClass> fn) {...}
Run Code Online (Sandbox Code Playgroud)

然后你可以用lambda或函数接口调用它:

myMethod(str -> new NewClass(str));
myMethod(NewClass::new);
Run Code Online (Sandbox Code Playgroud)

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

public myMethod(BiFunction<String, String, NewClass> fn) {...}
Run Code Online (Sandbox Code Playgroud)

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