Recientemente he dominado la expresión Lambda que se introdujo en Java 8. Encuentro que cada vez que uso una interfaz funcional, tiendo a usar siempre una expresión Lambda en lugar de crear una clase que implemente la interfaz funcional.
¿Se considera esto una buena práctica? ¿O son situaciones en las que no es apropiado usar un Lambda para una interfaz funcional?
Respuestas:
Hay una serie de criterios que deberían hacerle considerar no usar una lambda:
priceIsOver100
.x -> x.price > 100
es tan claro como ese nombre. Me refiero a nombres comoisEligibleVoter
ese que reemplazan una larga lista de condiciones.No te vayas por la borda. Recuerde, el software se cambia fácilmente. En caso de duda, escríbalo en ambos sentidos y vea cuál es más fácil de leer.
fuente
Depende. Siempre que se encuentre utilizando el mismo lambda en diferentes lugares, debería considerar implementar una clase que implemente la interfaz. Pero si hubieras usado una clase interna anónima, de lo contrario, creo que una lambda es mucho mejor.
fuente
Apoyo la respuesta de Karl Bielefeldt, pero quiero proporcionar una breve adición.
fuente
Acceso a variables locales del ámbito de aplicación.
La respuesta aceptada por Karl Bielefeldt es correcta. Puedo agregar una distinción más:
El código lambda anidado dentro de un método dentro de una clase puede acceder a cualquier variable final efectiva encontrada dentro de ese método y clase.
Crear una clase que implemente la interfaz funcional no le brinda dicho acceso directo al estado del código de llamada.
Para citar el Tutorial de Java (énfasis mío):
Por lo tanto, aunque hay beneficios al extraer un código largo y nombrarlo, debe sopesarlo con la simplicidad del acceso directo al estado del método y la clase adjuntos.
Ver:
fuente
Esto podría ser una trampa, pero a todos los otros puntos excelentes hechos en otras respuestas, agregaría:
Prefiera las referencias de métodos cuando sea posible. Comparar:
versus
El uso de una referencia de método le ahorra la necesidad de nombrar los argumentos de lambda, que generalmente son redundantes y / o conducen a nombres perezosos como
e
ox
.fuente
Sobre la base de la respuesta de Matt McHenry, puede haber una relación entre las referencias de método y lambda donde la lambda puede reescribirse como una serie de referencias de método. Por ejemplo:
vs
fuente