Enjoy A New Student Discount All 55,000 Courses on sale for Only $12.99

Ends in 05h 23m 49s

Java8 – Las funciones lambda

Cuando empiezas a intentar comprender que son las funciones lambda, quizás sea interesante plantearte el porque se crean, y, aunque hay varios motivos que hacen interesante su aparición, plantearos, por ejemplo, la gran cantidad de clases, que tenemos que crear a veces, para poder utilizar una Interface.

Esas clases no son optimas, ya que las podemos llenar de campos, y añadirle métodos, no siempre necesario, que hacen mas difícil entenderlas, y mas lentas en su ejecución

Leer más: Java8 – Las funciones lambda

El postulado sugerido inicialmente, hace que sea necesario conocer las interfaces funcionales, para poder pensar en utilizar desarrollos con Lambdas, y si, es así, por lo menos conceptualmente.

Sin embargo, en este articulo, solo quiero presentar como podemos trabajar con lambdas, dejando para otro capítulo el tema de las Interfaces funcionales, y mas adelante, los streams, que es donde aparecen con mas frecuencia estas expresiones

De momento, podemos considerar las funciones lambda, como una forma de escribir funciones anónimas, sin necesidad de documentarlas totalmente; por ejemplo, pensemos en una función que recibe dos parámetros y devuelve un booleano, para escribirlo como funcion lambda, podríamos hacer:

(int x, int y) -> x > y;

Hemos indicado los dos parámetros de entrada, que si pueden ser supuestos, no necesitaremos ni indicar el tipo; después la flecha, para indicar que lo que viene a continuación es el cuerpo de la función, y, por ultimo, la función, que en este caso es una simple comparación. Además, si lo podemos escribir en una linea, no necesitamos utilizar bloque {}, ni return, ya que se supone.

Podemos utilizar otras formas;

  • Si no se esperan parámetros
    • Deberemos indicar, como mínimo, los paréntesis
      • () -> System.out.println(«Hola»);
  • Si se espera un parámetro, pero el tipo puede ser supuesto,
    • podemos ignorar los paréntesis
      • str-> System.out.println(str)
    • Si el tipo no puede ser supuesto,
      • (String str) -> System.out.println(str)
  • Si no podemos resolver la función en una linea
    • Debemos utilizar la notación de bloque, e indicar la función return
      • (String s1, String s2) -> { return s2.length() – s1.length(); }
  • Tambien podemos devolver valores sin recibir parámetros
    • Devolvemos una constante
      • ()->»Hola»

Supongo, que ya estáis imaginando que una función lambda solo se puede utilizar en entornos donde el tipo de devolución esta definido, y la función que escribamos solo deberá facilitar ese tipo de devolución, y veréis que las utilizamos masivamente cuando tenemos que implementar las interfaces funcionales; por ejemplo, Comparator, la podríamos implementar así:

Comparator<String> c;
c = (String s1, String s2) -> s1.compareToIgnoreCase(s2);

Y si nos fijamos en como resolvemos Comparator, también podemos utilizar una función lambda, como parámetro.

Recordemos que Array.sort(T[] a, Comparator<? super T> c) tiene esta forma; eso significa que si le paso un array y una función que cumpla con la interface comparator, todo funcionará

c = Array.sort(elarray,(x,y)->x.length() > y.length()

Y antes que consideréis si es arduo o no, todo esto, quiero presentaros un ejemplo muy utilizado para ver las ventajas de estas funciones.

Supongamos que tenemos una clase que utiliza pantalla, y queremos escribir «Hola» cuando se pulse un botón; tradicionalmente, lo podríamos hacer así:

button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) { 
       System.out.println("hola");
    }
});

Sencillo y claro, aunque quizás no tanto como esto:

button.addActionListener(e -> System.out.println("hola"));

Como veis, no he tenido que crear la clase, para implementar el método. Si, lo he podido hacer porque ActionListener es una interface funcional… pero es que tenemos muchas, y podemos crear mas

Tal y como os comente al principio, para poder utilizar las lambdas, necesitamos conocer las interfaces funcionales, y a ello nos dedicaremos en el siguiente artículo

Deja un comentario

/*Si te ha gustado el artículo
no dudes en compartirlo*/

Facebook
Twitter
LinkedIn

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies

Ver mi IP

Ver ip de mi máquina
tipo valor
Ip: 3.143.4.181
Proxy: 3.143.4.181
Remote host: ec2-3-143-4-181.us-east-2.compute.amazonaws.com
Remote port: 34066
** 3.143.4.181, 172.70.126.97