代码之家  ›  专栏  ›  技术社区  ›  ShellDragon

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

  •  54
  • ShellDragon  · 技术社区  · 11 年前

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

    someList.stream().map(item -> new NewClass(item)).collect(Collectors.toList());
    
    someList.stream().map(NewClass::new).collect(Collectors.toList());
    
    1 回复  |  直到 10 年前
        1
  •  58
  •   Tagir Valeev    11 年前

    一般来说没有什么区别。 NewClass::new 与lambda版本一样,生成的字节码更少。自动生成的私有方法由java编译器从lambda主体创建,同时 NewClass: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) {...}
    

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