Introducción a las expresiones Lambda

La “nueva versión” (en su entonces) de JDK la versión 1.8, que introdujo Oracle en 2014, aunque es más conocida por la comunidad de programadores (“los javeros”) como Java 8.

Esta versión de JDK, introdujo muchos herramientas nuevas, en este artículo vamos a centrarnos en la que acercó, la que abrió la puerta a la programación funcional a Java, las expresiones Lambda. Aunque ya han pasado unos años desde entonces, actualmente, se siguen usando y cada vez más. Por lo que, vamos a repasar una de las herramientas más poderosas que se introdujeron en Java 8, bienvenidos a las expresiones Lambda.

Programación Imperativa vs Declarativa, cambiando el paradigma…

Las características de un lenguaje de programación dictaminan a que paradigma de programación pertenecen. Un paradigma de programación, es un estilo de desarrollar programas. En este caso en particular, nos vamos a centrar en dos de estos paradigmas de programación, de los cuales vamos a ver sus diferencias. Que son:

  • Programación Imperativa: este tipo de programación detalla las instrucciones necesarias para llegar a la solución. Es la más habitual, se centra en decirle al lenguaje de programación cada uno de los pasos a seguir (instrucción a instrucción), con la finalidad de que estos algoritmos, cambien el estado del programa.
    • Pregunta ¿Qué hacer? ¿Cómo hacerlo?
    • Un ejemplo podría ser Java.
  • Programación Declarativa: este tipo de programación describe el problema que se quiere solucionar, pero no las instrucciones necesarias para hacerlo. Algunos de los beneficios de este tipo de programación son que es compacto, otorga más fiabilidad (picamos menos fallamos menos), reduce los costes y es reutilizable.
    • Pregunta únicamente ¿Qué hacer? y no cómo hacerlo.
    • Un ejemplo podría ser SQL.

¿Qué son las expresiones lambdas?

En la actualidad, la mayoría de lenguajes modernos suelen tener las características muy similares. Y en lo referente al paradigma de programación funcional, un paradigma que se centra en la construcción de programas utilizando funciones. Es muy común, ver expresiones lambda en casi todos los lenguajes. Algunos por ejemplo podrían ser: JavaScript, C#, PHP… Y como no, ¡Java no iba a ser menos!

Cuando hablamos del término de lambdas, nos estamos refiriendo a una nueva característica de los lenguajes de programación, que consiste en métodos anónimos. El término de métodos anónimos, se refiere a métodos que no tienen un identificador (nombre). Al no tener un identificador, para ser utilizados, necesitan una subclase o bien una interfaz donde ser ejecutados.

La programación funcional tiene un comportamiento que nos abstrae. Este comportamiento, es muy similar al comportamiento de una caja negra, que lo que hace es traspasarnos el estado de una operación a otra.

El código resultante será muy similar a: optA().optB().optC().optD(); (lo veremos con ejemplos prácticos más abajo).

Las lambdas expresions, utilizan uno de los conceptos más importantes del diseño de software SOLID. El Single Responsibility Principle (SRP), es decir, que una función tiene únicamente un propósito, no hay que confundir el tener un único propósito, con que solamente tengan una sola declaración ya que una expresión lambda puede tener múltiples declaraciones.

Anteriormente, en la sección superior, hemos visto estas diferencias entre dos paradigmas de programación: la programación imperativa y la programación declarativa. Una de las finalidades de las expresiones expresiones lambdas es el convertir funciones en un tipo de programación imperativa, gracias a la programación funcional (que se basa en un estilo declarativo) a una programación declarativa. Busca por tanto, transformar “funciones imperativas”, a un tipo de programación declarativo, por tanto, a “funciones declarativas”.

Uno de los beneficios que nos otorgan estas expresiones son su sintaxis, es el de simplificar el desarrollo de una función. Con ello, ofrecemos una clara reducción de código que le otorga una ventaja respecto a otras maneras de solucionar el problema. Principalmente, si posteriormente se combina con steams, como por ejemplo: map, filter, reduce, etc.

En muchos de los puntos que vamos a ver, vamos a tratar de

  • Si no vamos a utilizar parámetros necesitamos añadir los paracentesis en blanco:
    • () -> System.out.prinl(“Ejemplo sin parametros”);
  • SI ponemos un solo parametro podemos omigite el parentesis:
    • (a) -> System.out.print(a * 2);
    • a -> System.out.print(a * 2);
  • Como norma general, se aconseja tener todo el código de una expresión lambda en una línea con el fin de que sea más legible.
    • () -> System.out.print().

Ventajas de las expresiones lambdas

En resumen, algunas ventajas de las expresiones lambas (aunque no todas) son:

  • Concepto de caja negra (entrada salida sin muchas preocupaciones).
  • El código se vuelve más declarativo (programación declarativa) y menos no imperativo (programación imperativa).
  • El código se vuelve más compacto, más simple, más fácil de leer y también más elegante.
  • Aportan una sintaxis básica.
  • Singularidad (SOLID o Responsabilidad única).

Estructura y características de una expresión lambda:

La estructura de una lambda:

(Lista de argumentos) -> Cuerpo de la expresión lambda

  • Lista de argumentos o también conocido como parámetros: una expresión lambda no necesariamente debe tener parámetros, aunque si que los puede tener tanto uno o más (1 o +). Si no tiene parámetros o solamente tiene uno, no requiere el uso de paréntesis ().
  • Operador lambda ->
  • Cuerpo de la expresión: es donde escribimos lo que tiene que hacer la expresión lambda. Si tenemos varias líneas, podemos englobar el cuerpo mediante a unos corchetes

Ejemplos de expresiones lambda

Vamos a ver un resumen de algunos de los ejemplos más comunes de expresiones lambda:

Expresión lambda sin argumentos

() -> Cuerpo de la expresión lambda

Expresión lambda con un argumento

(Arg) -> Cuerpo de la expresión lambda

Arg -> Cuerpo de la expresión lambda

Expresión lambda con varios argumento

(arg1, arg2, arg3) -> {

Instrucción 1;

Instrucción 2;

}

Expresiones lambda con datos explícitos

(Integer a) -> System.out.println(a);

“Marcos o entornos” donde ejecutar expresiones lambda

En la parte introductoria inicial del artículo, hemos hablado sobre las expresiones en lambda. Y sobre que necesitan una subclase o bien una interfaz donde ser ejecutados. Estás expresiones no pueden ser ejecutadas directamente sin más. Sino tienen que ser ejecutadas en un marco o en un entorno “particular, determinada, específico”. Vamos a ver algunos de estos “marcos” donde sí que se pueden ejecutar.

Desde dentro de una subclase

Primeramente, vamos a comenzar ejecutando expresiones lambda en una subclase.

Mostrando los elementos de un Array sin Lambda (a la antigua usanza)

La solución clásica, de mostrar los elementos de un arrayList, podría ser:

El resultado sería el siguiente:

Mostrando los elementos de un Array Array con Lambda

Si lo hacemos lo mismo que en la solución clásica con lambda (y aunque aún no hemos visto todo su potencial), podemos ver que se reduce a tan solo una sola línea. Que además, resulta muy intuitiva.

El resultado sería el siguiente:

Mostrando los elementos de un Array ordenados sin Lambda (a la antigua usanza)

En este caso, hemos realizado la ordenación de 3 maneras. Están ordenadas por orden según su eficiencia, de menos eficiente a más eficiente.

El resultado sería el siguiente:

Ordenando los elementos de un Array con Lambda

Y finalmente, con este ejercicio, sí que podemos empezar a hacernos una idea del potencial que tienen las expresiones lambdas. Los dos primeros casos, ocupan 2 líneas, pero en el 3 caso, ocupa solamente 1 línea. Aunque lo explicaremos en otro artículo debido a que no quiero extender demasiado con este artículo.

El resultado sería el siguiente:

Desde dentro de una interfaz

Vamos a hacer una interfaz llamada calculadora que tenga un método llamado suma que nos calculé la suma de dos números, como en los ejemplos anteriores, de la manera clásica y con lambda.

Dentro de una interfaz con un solo método y sin Lambda (a la antigua usanza)

Opción 1:

Opción 2:

El resultado sería el siguiente:

Dentro de una interfaz con un solo método y Lambda

Opción 1:

Opción 2:

El resultado sería el siguiente:

Desventajas de las expresiones lambdas

Llegados a este punto, no todo iba a ser del color de rosas, las lambdas también tienen desventajas y ahora vamos a ver algunos su principal desventaja.

  • Si utilizamos interfaces, las lambdas están desarrolladas para solamente trabajar con un único método en su interior.
  • Si tenemos varios métodos, los requisitos a cumplir son:
    • Todos los métodos deben de tener la misma cantidad de parámetros.
    • Se deben declarar métodos a utilizar como default o static.
    • El resto de métodos quedaran inutilizados.

Desde dentro de una interfaz II

Vamos a ver un ejemplo donde nos vamos a encontrar con la principal desventaja de las lambdas. Si queremos realizar el mismo ejercicio de la calculadora pero, esta vez, con múltiples interfaces (suma, resta, división…), nos vamos a encontrar con un problema.

Dentro de una interfaz con múltiples métodos y sin Lambda (a la antigua usanza)

El resultado sería el siguiente:

Dentro de una interfaz con múltiples métodos y con Lambda

Si declaramos un código como este, podemos ver que lambda no sabe que interfaz debe utilizar.

Solamente nos funcionará si tenemos un método sin default y otro con como mínimo y con el cuerpo con return.

El resultado sería el siguiente:

Bueno en las próximas clases, entraremos más al detalle con las que ya son “nuestras amigas”, las expresiones lambda. Saludos javer@s!

3 comentarios

  1. Howdy! This post couldn’t be written any better!
    Reading this post reminds me of my old room mate!
    He always kept talking about this. I will forward
    this article to him. Fairly certain he will have a good
    read. Thanks for sharing!

  2. I truly love your site.. Pleasant colors & theme.
    Did you develop this website yourself? Please reply back as I’m planning to
    create my very own blog and would like to find out where
    you got this from or what the theme is called. Kudos!

  3. Can I simply just say what a comfort to find a person that genuinely knows what they
    are talking about on the internet. You actually know how to
    bring an issue to light and make it important. A lot more people have to check this out and understand this side of your story.
    It’s surprising you are not more popular since you surely have the gift.
    cheap flights http://1704milesapart.tumblr.com/ cheap flights

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

La Ley 34/2002 nos obliga a avisarte de que usamos cookies propias y de terceros con objetivos estadísticos y de sesión y para mostrarte la 'publi' que nos da de comer. Tranquilo, este mensaje solo sale una vez. Más información

Java desde 0 comunica a los usuarios, a través de este aviso, que puede utilizar cookies cuando el usuario navega por las diferentes pantallas y páginas del sitio. Durante el uso de nuestra página Web usted acepta y autoriza expresamente el uso de cookies, de acuerdo con nuestra Política de Privacidad. Este sitio web utiliza las siguientes cookies propias: - Cookies de sesión, para garantizar que los usuarios que escriban comentarios en el blog sean humanos y no aplicaciones automatizadas. De esta forma se combate el spam. Este sitio web utiliza las siguientes cookies de terceros: - Google AdManager y AdSense: Utiliza cookies para mejorar la publicidad. Entre otros fines, suelen utilizarse para segmentarla según el contenido que sea relevante para los usuarios o su ubicación, mejorar los informes de rendimiento de las campañas y evitar mostrar anuncios que los usuarios ya hayan visto. Las cookies no contienen información personal identificable. Consulta cómo utiliza Google la información de sitios web o aplicaciones. y cómo bloquear determinados anuncios. - Google Analytics: Almacena cookies para poder elaborar estadísticas sobre el tráfico y volumen de visitas de esta web. Al utilizar este sitio web está consintiendo el tratamiento de información acerca de usted por Google. Por tanto, el ejercicio de cualquier derecho en este sentido deberá hacerlo comunicando directamente con Google. - Redes sociales: Cada red social utiliza sus propias cookies para que usted pueda pinchar en botones del tipo Me gusta o Compartir.

Cerrar