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

除了后者的可读性稍好之外,在使用以下结构时是否存在差异?

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

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

答案 1

通常没有区别。 生成的字节码更少,因为在 lambda 版本中,Java 编译器从 lambda 主体创建自动生成的私有方法,同时直接链接到构造函数方法句柄。因此,使用方法引用,您的类文件大小可能会略小。不过,预计不会有明显的性能差异。NewClass::newNewClass:new

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

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

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

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

然后,您可以使用lambda或函数接口同时调用它:

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

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

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

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


答案 2

推荐