Las expresiones lambda no cambian el conjunto de problemas que puede resolver con Java en general, pero definitivamente facilitan la resolución de ciertos problemas, por la misma razón que ya no estamos programando en lenguaje ensamblador. Eliminar las tareas redundantes del trabajo del programador facilita la vida y permite hacer cosas que ni siquiera tocarías de otra manera, solo por la cantidad de código que tendrías que producir (manualmente).
Pero las expresiones lambda no solo guardan líneas de código. Las expresiones lambda le permiten definir funciones , algo para lo que antes podía usar clases internas anónimas como solución alternativa, por eso puede reemplazar las clases internas anónimas en estos casos, pero no en general.
En particular, las expresiones lambda se definen independientemente de la interfaz funcional a la que se convertirán, por lo que no hay miembros heredados a los que puedan acceder, además, no pueden acceder a la instancia del tipo que implementa la interfaz funcional. Dentro de una expresión lambda, this
y super
tienen el mismo significado que en el contexto circundante, consulte también esta respuesta . Además, no puede crear nuevas variables locales que sombreen las variables locales del contexto circundante. Para la tarea prevista de definir una función, esto elimina muchas fuentes de error, pero también implica que para otros casos de uso, puede haber clases internas anónimas que no se pueden convertir en una expresión lambda, incluso si se implementa una interfaz funcional.
Además, la construcción new Type() { … }
garantiza producir una nueva instancia distinta (como new
siempre lo hace). Las instancias de clases internas anónimas siempre mantienen una referencia a su instancia externa si se crean en un static
contexto no . Por el contrario, las expresiones lambda solo capturan una referencia this
cuando es necesario, es decir, si acceden this
o un no static
miembro. Y producen instancias de una identidad no especificada intencionalmente, lo que permite que la implementación decida en tiempo de ejecución si reutiliza las instancias existentes (consulte también “ ¿Una expresión lambda crea un objeto en el montón cada vez que se ejecuta? ”).
Estas diferencias se aplican a su ejemplo. Su construcción de clase interna anónima siempre producirá una nueva instancia, también puede capturar una referencia a la instancia externa, mientras que su (Developer o1, Developer o2) -> o1.getName().compareTo(o2.getName())
es una expresión lambda que no captura y que evaluará a un singleton en implementaciones típicas. Además, no .class
genera un archivo en su disco duro.
Dadas las diferencias en cuanto a semántica y rendimiento, las expresiones lambda pueden cambiar la forma en que los programadores resolverán ciertos problemas en el futuro, por supuesto, también debido a que las nuevas API adoptan ideas de programación funcional utilizando las nuevas características del lenguaje. Consulte también Expresión lambda de Java 8 y valores de primera clase .
(o1, o2) -> o1.getName().compareTo(o2.getName())