A partir de la implementación actual de JRE, Function.identity()siempre devolverá la misma instancia, mientras que cada aparición identifier -> identifierno 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 -> xpodría ahorrar algo de memoria, pero eso no debería impulsar su decisión si realmente cree que x -> xes 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 Functioninstancia 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.