A partir de la implementación actual de JRE, Function.identity()
siempre devolverá la misma instancia, mientras que cada aparición identifier -> identifier
no solo creará su propia instancia, sino que incluso tendrá una clase de implementación distinta. Para más detalles, ver aquí .
La razón es que el compilador genera un método sintético que contiene el cuerpo trivial de esa expresión lambda (en el caso de x->x
, equivalente a return identifier;
) y le dice al tiempo de ejecución que cree una implementación de la interfaz funcional que llama a este método. Por lo tanto, el tiempo de ejecución solo ve diferentes métodos de destino y la implementación actual no analiza los métodos para averiguar si ciertos métodos son equivalentes.
Por lo tanto, usar en Function.identity()
lugar de x -> x
podría ahorrar algo de memoria, pero eso no debería impulsar su decisión si realmente cree que x -> x
es más legible que Function.identity()
.
También puede considerar que al compilar con la información de depuración habilitada, el método sintético tendrá un atributo de depuración de línea que apunta a la (s) línea (s) del código fuente que contiene la expresión lambda, por lo tanto, tiene la posibilidad de encontrar el origen de una Function
instancia particular mientras se depura . Por el contrario, al encontrar la instancia devuelta por Function.identity()
durante la depuración de una operación, no sabrá quién llamó a ese método y pasó la instancia a la operación.