variable parameter expressions expresiones example ejemplos advanced java lambda java-8

parameter - Expresión Java 8 lambda y valores de primera clase



lambda expressions java 8 example (5)

Como yo lo veo, es azúcar sintáctico, pero además de la inferencia de tipo, un nuevo paquete java.util.functions y la semántica de las clases internas aparece como un valor de primera clase.

¿Son los cierres de Java 8 realmente valores de primera clase o son solo un azúcar sintáctico?


Para mí, Lambdas en Java 8 es solo azúcar de sintaxis porque no puedes usarlo como Ciudadano de Primera Clase ( http://en.wikipedia.org/wiki/First-class_function ) cada función debe ser envuelta en un objeto que impone muchas limitaciones cuando se compara con lenguaje con una función de primera clase pura como SCALA. Los cierres de Java 8 solo pueden capturar variables no locales inmutables ("efectivamente finales").

Aquí hay una mejor explicación de por qué es sintaxis-azúcar Java Lambdas y cierres


Un cierre real con una vinculación variable con el contexto externo tiene algunos gastos generales. Consideraría la implementación de Java 8 óptima, suficientemente pura.

No es meramente azúcar sintáctica al menos.

Y no sabría de ninguna implementación más óptima.


Yo diría que los cierres de Java 8 ("Lambdas") no son meros azúcares sintácticos ni son valores de primera clase.

He abordado el problema del azúcar sintáctico en una answer a otra pregunta de StackExchange.

En cuanto a si las lambdas son de "primera clase", realmente depende de tu definición, pero haré un caso de que las lambdas no son realmente de primera clase.

En cierto sentido, un lambda quiere ser una función, pero Java 8 no agrega tipos de funciones. En cambio, una expresión lambda se convierte en una instancia de una interfaz funcional. Esto ha permitido agregar lambdas a Java 8 con solo cambios menores en el sistema de tipos de Java. Después de la conversión, el resultado es una referencia como la de cualquier otro tipo de referencia. De hecho, usar un Lambda, por ejemplo, en un método que pasó una expresión lambda como parámetro, es indistinguible de llamar a un método a través de una interfaz. Un método que recibe un parámetro de un tipo de interfaz funcional no puede decir si se pasó una expresión lambda o una instancia de alguna clase que implemente esa interfaz funcional.

Para obtener más información acerca de si las lambdas son objetos, consulte las lambdafaq.org/are-lambda-expressions-objects esta pregunta.

Dado que las lambdas se convierten en objetos, heredan (literalmente) todas las características de los objetos. En particular, objetos:

  • tener varios métodos como equals , getClass , hashCode , hashCode , toString y wait
  • tener un código hash de identidad
  • puede ser bloqueado por un bloque synchronized
  • se puede comparar usando == y != e instanceof operadores

Etcétera. De hecho, todos estos son irrelevantes para el uso previsto de lambdas. Su comportamiento es esencialmente indefinido. Puede escribir un programa que use cualquiera de estos y obtendrá algún resultado, pero el resultado puede diferir de un lanzamiento a otro (¡o incluso ejecutarse para ejecutarse!).

Volviendo a expresar esto de manera más concisa, en Java los objetos tienen identidad , pero los valores (particularmente los valores de las funciones, si existieran) no deberían tener ninguna noción de identidad. Java 8 no tiene tipos de funciones. En cambio, las expresiones lambda se convierten en objetos, por lo que tienen mucho equipaje que es irrelevante para las funciones, particularmente la identidad. Eso no me parece de "primera clase".

Actualización 2013-10-24

He estado pensando más en este tema desde que publiqué mi respuesta hace varios meses. Desde un punto de vista técnico, todo lo que escribí arriba es correcto. La conclusión probablemente se exprese con mayor precisión ya que Java 8 lambdas no son valores puros (a diferencia de los de primera clase ), ya que llevan una gran cantidad de equipaje de objetos. Sin embargo, solo porque sean impuros no significa que no sean de primera clase. Considere la definición de Wikipedia de la función de primera clase. En resumen, los criterios enumerados allí para considerar las funciones de primera clase son las habilidades para:

  • pasar funciones como argumentos a otras funciones
  • funciones de retorno de otras funciones
  • asignar funciones a variables
  • almacenar funciones en estructuras de datos
  • tener funciones ser anónimo

Java 8 lambdas cumple con todos estos criterios. Entonces eso los hace parecer de primera clase.

El artículo también menciona nombres de funciones que no tienen un estado especial, en cambio el nombre de una función es simplemente una variable cuyo tipo es un tipo de función. Java 8 lambdas no cumplen este último criterio. Java 8 no tiene tipos de funciones; tiene interfaces funcionales. Estos se usan de manera efectiva como tipos de funciones, pero no son tipos de funciones en absoluto. Si tiene una referencia cuyo tipo es una interfaz funcional, no tiene idea de si es una lambda, una instancia de una clase interna anónima o una instancia de una clase concreta que implemente esa interfaz.

En resumen, Java 8 lambdas son más funciones de primera clase de lo que había pensado originalmente. Simplemente no son funciones puras de primera clase.


, son valores de primera clase (o lo serán, una vez que se haya lanzado Java 8 ...)

En el sentido de que puede pasarlos como argumentos, compárelos para realizar funciones de orden superior, guárdelos en estructuras de datos, etc. Podrá usarlos para una amplia gama de técnicas de programación funcional.

Ver también para una definición un poco más de lo que significa "primera clase" en este contexto: