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 lambdaEl 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»);
- Deberemos indicar, como mínimo, los paréntesis
- 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)
- podemos ignorar los paréntesis
- 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(); }
- Debemos utilizar la notación de bloque, e indicar la función return
- Tambien podemos devolver valores sin recibir parámetros
- Devolvemos una constante
- ()->»Hola»
- Devolvemos una constante
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
Relacionado
Descubre más desde Recursos para formacion
Suscríbete y recibe las últimas entradas en tu correo electrónico.