Development

Comenzando con Lambdas y Streams en Java

Publicado por
Luis Benavides
Comenzando con Lambdas y Streams en Java
Escrito por
Luis Benavides
Publicado en
August 2, 2024
Tiempo de lectura
Categoría
Development

Queries en Azure DevOps

Si has visto un código parecido a este:

names.forEach(System.out::println);

y no tienes idea de qué se trata, o viéndolo de reojo piensas “tal vez hace esto”, pero no estás totalmente seguro, sigue leyendo este post que de seguro te aclarará algunas dudas. El código anterior es un ejemplo de programación funcional en Java, que se encuentra disponible desde su octava versión. Dicho tipo de programación consiste, más que nada, en ahorrar tiempo y líneas de código, además de facilitar el entendimiento de un código. Para programar de esta forma usamos dos tipos de funciones, por una parte, las Lambdas y, por otra, las Method reference operator o también conocidas como Double colon (::). A continuación, te mostramos sus estructuras:

Lambdas

Consisten en tres partes: los parámetros, arrow operator (->) (en este caso el guion y el signo mayor, que deben estar seguidos, no pueden tener espacios entre sí), y el cuerpo de la función.

 () -> System.out.println("Hello Functional World")

En este caso, los parámetros son nulos, por lo tanto, es necesario usar los paréntesis vacíos, agregar el arrow operator (->) y, finalmente, el cuerpo de la función que, en este caso, imprimirá el mensaje en la consola. En el caso de que tenga un solo parámetro se pueden obviar los paréntesis, a menos que se indique el tipo de la variable.

 a -> System.out.println(a)
 (String a) -> System.out.println(a)

Si existe más de un parámetro los paréntesis son necesarios. En todos los casos indicados, el cuerpo solo cumple una sentencia, por esto no es necesario que termine en punto y coma (;). Pero, si tuviera más de una, sería necesaria la siguiente estructura:

 a->{
   System.out.println(a);
   System.out.println(a.length());
 }

Si fuese necesario retornar algo y es una función de una sola sentencia, no es necesario especificar el return.

 a -> a+1
 a -> { return a+1; }

En ambos casos, las líneas de código hacen lo mismo, retornando el valor a + 1, por lo que cumplen la misma función.

Double Colon (::)

Esta funciona de manera muy parecida a las Lambdas, sin embargo, el Double colon se utilizará en lugar de Lambdas en el caso de que la función tenga solo una sentencia y que dicha sentencia sea un método estático, un constructor o un método de una instancia. En este caso, los parámetros se obvian y solo se llama a la función

 a -> System.out.println(a)
 System.out::println

Estas dos cumplen el mismo fin.

Ejemplo:

Digamos que tenemos un array de Strings y quisiéramos mostrar en consola cada uno de los valores, con la programación funcional nos ahorraríamos algunas líneas:

 ArrayList<String> names =
   Lists.newArrayList(
       "John", "John", "Mariam", "Alex", "Mohammado", "Mohammado", "Vincent", "Alex", "Alex");

Antes de la programación funcional se hubiese tenido que hacer de la siguiente manera:

 for (String name : names) {
   System.out.println(name);
 }

Ahora sería algo así:

 names.forEach(name->System.out.println(name));

Incluso podría acortarse aún más, así:

 names.forEach(System.out::println);

El resultado de lo anterior sería algo como esto:

 John
 John
 Mariam
 Alex
 Mohammado
 Mohammado
 Vincent
 Alex
 Alex

API Stream

Stream es una librería que facilita mucho el trabajo con collections, como List y Sets, y consiste en solo llamar un método.

 names.stream()

Luego de esto se llama al resto de las funciones. Ahora hablaré de aquellas que considero más útiles.

attach icon
Adjuntar archivo
máximo: 10MB
Descarga el archivo haciendo click en el botón
Click aquí
¡Ups! Algo salió mal al enviar el formulario.

Crea tu propio manual de marca con esta plantilla gratuita.
¡Organiza tus activos de diseño de forma más eficiente!

Es
Eng