significado - metodos de instancia en java
Nueva instanciación de objetos cuando se utilizan flujos de Java 8 (1)
¿Hay alguna diferencia en el uso de las siguientes contstructs, aparte de una legibilidad ligeramente mejor en este último?
someList.stream().map(item -> new NewClass(item)).collect(Collectors.toList());
someList.stream().map(NewClass::new).collect(Collectors.toList());
En general, no hay diferencia. NewClass::new
produce menos bytecode ya que en la versión lambda se crea un método privado generado automáticamente por el compilador java del cuerpo lambda, mientras que NewClass:new
enlaza directamente con el manejador del método constructor. Entonces, usando referencias de métodos, puede tener un tamaño de archivo de clase ligeramente menor. Sin embargo, no se espera una diferencia de rendimiento significativa.
Otra diferencia es el procedimiento de resolución de método. No es aplicable en su ejemplo particular, pero puede ser aplicable en otro código. Por ejemplo, tienes dos constructores:
public NewClass(String a) {...}
public NewClass(String a, String b) {...}
Y tienes algún método que acepta interfaz funcional:
public myMethod(Function<String, NewClass> fn) {...}
Luego puede llamarlo tanto con lambda como con la interfaz funcional:
myMethod(str -> new NewClass(str));
myMethod(NewClass::new);
Pero supongamos que luego agrega un nuevo método con el mismo nombre como este:
public myMethod(BiFunction<String, String, NewClass> fn) {...}
Entonces, la llamada de referencia del método se volverá ambigua y dará como resultado un error de compilación, ya que NewClass::new
ahora coincide con ambos constructores, mientras que lambda aún no es ambiguo.