He visto una gran cantidad de procedimientos en los que una nueva clase se instancia en un método de referencia lambda, pero parece que no puede entender por qué. ¿Cuándo es la new
palabra clave necesaria en una referencia método?
Por ejemplo, el siguiente pasa compilación:
UnaryOperator<String>stringToUpperCase = String::toUpperCase;
Pero esto no es así:
UnaryOperator<String>stringToUpperCase = new String()::toUpperCase;
String::toUpperCase
es una referencia método que se puede aplicar a cualquier String
instancia.
new String()::toUpperCase
es una referencia método que se puede aplicar a un específico String
instancia (la instancia creada por new String()
).
Desde UnaryOperator<String>
espera un método que toma una String
y devuelve una String
, String::toUpperCase
ataques (ya que se puede aplicar en una String
y obtener la versión mayúscula de ese String
).
Por otra parte, new String()::toUpperCase
no se ajusta UnaryOperator<String>
, ya que se ejecuta en un ya especificada String
, por lo que no se puede pasar otra String
instancia a la misma.
Puede, sin embargo, por asignado a una Supplier<String>
, ya que simplemente suministra un vacío String
ejemplo:
Supplier<String> emptyStringToUpperCase = new String()::toUpperCase;
Esto es similar a:
Supplier<String> emptyStringToUpperCase = () -> new String().toUpperCase();
mientras esto:
UnaryOperator<String> stringToUpperCase = String::toUpperCase;
es parecido a:
UnaryOperator<String> stringToUpperCase = s -> s.toUpperCase();