Poco a poco Java 8 se va dando a conocer como plataforma de desarrollo e incluye una serie de novedades. Entre las cuales hay que destacar las lambda expresions (Expresiones Lambda) que se echaban bastante ya que otros lenguajes como C# ya soportaban estructuras similares. El uso de Expresiones Lambda nos permitirá simplificar de forma muy clara algunos de los bloques de código que construíamos hasta ahora. Bloques que en muchos casos hacían uso de clases anónimas para solventar problemas que una expresión lambda expresa de una forma mucho mas directa. Vamos a ver un sencillo bloque de código que usa un Comparador para ordenar una lista de Personas.
package com.arquitecturajava; public class Persona { private String nombre; public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public Persona(String nombre) { super(); this.nombre = nombre; } }
package com.arquitecturajava; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; public class Principal { public static void main(String[] args) { ArrayList<Persona> milista= new ArrayList<Persona>(); milista.add(new Persona("Miguel")); milista.add(new Persona("Alicia")); Collections.sort(milista,new Comparator<Persona>() { public int compare(Persona p1,Persona p2) { return p1.getNombre().compareTo(p2.getNombre()); } }); for (Persona p: milista) { System.out.println(p.getNombre()); } } }
Hemos usado un Comparator para ordenar a las Personas por su nombre.
Eso si el código es bastante engorroso. y realmente si nos ponemos a pensar lo único importante en todo el bloque del comparador es:
(Persona p1,Persona p2) { return p1.getNombre().compareTo(p2.getNombre()); }
Esta parte del código es la que implemente la lógica de ordenación y como vemos es practicamente una función. Las expresiones lambda de Java 8 convierten a las funciones en elementos de primer nivel en el Lenguaje Java de tal forma que se puedan usar de una forma más sencilla y directa.
Lambda Expressions
Una expresión lambda se compone de dos elementos. En primer lugar de un conjunto de parámetros y en segundo lugar de una expresión que opera con los parámetros indicados.
Vamos a hacer uso de una expresión lambda en el ejemplo anterior para simplificar el manejo de los interfaces :
package com.arquitecturajava; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; public class Principal2 { public static void main(String[] args) { ArrayList<Persona> milista= new ArrayList<Persona>(); milista.add(new Persona("Miguel")); milista.add(new Persona("Alicia")); Collections.sort(milista, (Persona p1,Persona p2)-> p1.getNombre().compareTo(p2.getNombre())); for (Persona p: milista) { System.out.println(p.getNombre()); } } }
Como podemos ver la siguiente linea de código simplifica sobre manera el programa:
Collections.sort(milista, (Persona p1,Persona p2)-> p1.getNombre().compareTo(p2.getNombre()));
La programación funcional y el uso de expresiones lambda nos ayudará a construir programas más claros y más flexibles
Muy buenas pildoras, me está sirviendo mucho , tanto a nivel docente como a nivel programador…
[…] artículos relacionados: Java Lambda, Programación Funcional, Java 8 Streams Java Functional […]
[…] Otros artículos relacionados : jQuery Sizzle Engine , Java 8 Lambda […]
[…] Otros artículos relacionados : Java super() y this() , Java Lambda , […]
[…] artículos relacionados: Java Lambdas , Java Streams , Java references […]
[…] artículos relacionados: Java Lambda , Java Streams , […]
Gracias, muy buena explicación para los que no tenemos mucha experiencia en Java al poner el programa “sin Lambda” y después “con Lambda”.
He realizado el ejercicio, y de verdad que esta mas claro y mejor.
Me alegro que te sea útil
[…] artículos relacionados : Java Lambda , Java Streams , Stream y […]
[…] artículos relacionados : Java Lambda , Java Streams , Java […]
[…] Otros artículos relacionados: Java Fluid Interface , Java constructores this() vs super() , Java Lambda […]
Hola Cecilio,
es un ejemplo muy bueno y muy instructivo, pero hay una cosa que no me acaba de cuadrar: el método sort recibe como parámetro un Comparator, mientras que la Lambda devuelve un int ¿como resuelve esto el compilador?
Muchas gracias de antemano y enhorabuena por tus artículos.
Pero el parametro que pasas es una expresión lambda , eso es lo importante un interface una expressión lambda es como un interface en muchos casos
La cuestion es que la expresion lambda es similar a las clases anonimas pero para funciones. Una expresion lambda es el parametro que acepta una interfaz funcional. Y una interfaz funcional es una interfaz que tiene un metodo abstracto y solo uno.
gracias:)
Usando el código aquí expuesto, lo que se obtiene es un hermoso error de compilación (o más bien dos):
Exception in thread “main” java.lang.Error: Unresolved compilation problems:
The method sort(List, Comparator) in the type Collections is not applicable for the arguments (List, (Persona p1, Persona p2) -> {})
Type mismatch: cannot convert from Comparator to Comparator
[…] artículos relacionados : Java 8 Lambda ,Java Collections y […]
[…] artículos relacionados: Java Lambda , Java Reference Methods , Java […]
[…] artículos relacionados: Java Lambda , Java Lambda Reduce ,Java Lambda […]
[…] artículos relacionados: Expresiones Lambda , JavaScript Reduce , Java Lambda […]
[…] artículos relacionados: Introducción a Lambda , Java Streams , Java Lambda WorkFlows , Oracle Java […]
[…] artículos relacionados: Java Lambda , Java Streams , Java Streams WorkFlows , Oracle Java […]
[…] Otros artículos relacionados: Programación funcional y Streams , Java 8 default Methods , Java 8 Lambda […]
[…] Otros artículos relacionados: ForEach vs Iterator , Expresiones Lambda ,JavaStreams […]
Gracias por el aporte!, más claro imposible
de nada 🙂
[…] Java 8 Lambda , Java 8 Date Time , Java 8 Streams […]
[…] Artículos relacionados: Java Lambda ForEach, Introducción a Java Lambda , Java […]
[…] Otros artículos relacionados : Java Generics , Java Generic y WildCards , Java Lambda […]
[…] artículos relacionados : forEach vs Iterator, Java Lambda Expressions ,Uso de […]
Muchas gracias amigo, muy claro y conciso, podrías decirme que otras novedades tiene Java 8?. Saludos
Ire publicando cosillas poco a poco 🙂
[…] artículos relacionados: Introducción a Java Lambda , Java Lambda forEach ,Java 8 Date […]
De hecho para ordenar la lista podrías usar:
milista.sort((p1, p2) -> p1.getNombre().compareTo(p2.getNombre()));
¿no?
Si puedes apoyarte en expresiones lambda para muchas cosas 🙂
Estas seguro? El metodo sort es estatico segun la api de Java 8.
[…] Artículos relacionados: Expresiones Lambda ,Lambda ForEach, […]
[…] artículos relacionados: Java y Expresiones Lambda ,Java […]
Hola!, Agradezco sus aportaciones su blog me ha sido de gran ayuda siempre.
Me gustaría saber su opinión sobre los últimos cambios que sufre java, las tendencias del desarrollo actual y la forma en como oracle conduce al lenguaje para abordarlas.
Muchas gracias nuevamente.
gracias me apunto la idea 🙂