Java 8 Lambda Expressions (I)

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.

ordenacion

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.

lambda

 

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

Otros artículos similares :

String y StringBuilder

Java Generics 

 

It's only fair to share...Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn

About Cecilio Álvarez Caules

Cecilio Álvarez Caules Sun Certified Enterprise Architech (J2EE/JEE).

37 Responses to Java 8 Lambda Expressions (I)

  1. Adolfo Muñoz 24 Octubre, 2016 at 17:25 #

    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.

    • Cecilio Álvarez Caules 25 Octubre, 2016 at 8:11 #

      Me alegro que te sea útil

  2. Daniel 22 Agosto, 2016 at 15:20 #

    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.

    • Cecilio Álvarez Caules 25 Agosto, 2016 at 12:11 #

      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

    • Israel MR 28 Noviembre, 2016 at 14:25 #

      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

  3. ehval 29 Julio, 2015 at 22:26 #

    Gracias por el aporte!, más claro imposible

    • Cecilio Álvarez Caules 30 Julio, 2015 at 7:41 #

      de nada 🙂

  4. AlkaVegettaRexOMG 21 Abril, 2015 at 21:04 #

    Muchas gracias amigo, muy claro y conciso, podrías decirme que otras novedades tiene Java 8?. Saludos

    • Cecilio Álvarez Caules 24 Abril, 2015 at 8:21 #

      Ire publicando cosillas poco a poco 🙂

  5. Santy 17 Octubre, 2014 at 14:18 #

    De hecho para ordenar la lista podrías usar:

    milista.sort((p1, p2) -> p1.getNombre().compareTo(p2.getNombre()));

    ¿no?

    • Cecilio Álvarez Caules 17 Octubre, 2014 at 23:55 #

      Si puedes apoyarte en expresiones lambda para muchas cosas 🙂

    • Ale Perez 23 Febrero, 2017 at 11:47 #

      Estas seguro? El metodo sort es estatico segun la api de Java 8.

  6. Gustavo 7 Agosto, 2014 at 15:32 #

    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.

    • Cecilio Álvarez Caules 7 Agosto, 2014 at 20:00 #

      gracias me apunto la idea 🙂

Trackbacks/Pingbacks

  1. Java 8 Optional y NullPointerExceptions - Arquitectura Java - 9 Febrero, 2017

    […] artículos relacionados: Java Lambda,  Programación Funcional, Java 8 Streams Java Functional […]

  2. Java Nashorn JavaScript - Arquitectura Java - 8 Enero, 2017

    […] Otros artículos relacionados : jQuery Sizzle Engine , Java 8 Lambda […]

  3. Java Static Import - Arquitectura Java - 8 Enero, 2017

    […] Otros artículos relacionados :  Java super() y this()  , Java Lambda , […]

  4. Java time package y clases fundamentales - Arquitectura Java - 7 Enero, 2017

    […] artículos relacionados: Java Lambdas , Java Streams  , Java references […]

  5. Java Predicate Interface y sus métodos - Arquitectura Java - 2 Noviembre, 2016

    […] artículos relacionados: Java Lambda , Java Streams , […]

  6. El concepto de Java infinite Stream - Arquitectura Java - 13 Octubre, 2016

    […] artículos relacionados : Java Lambda , Java Streams , Stream y […]

  7. Programacion Imperativa vs Declarativa - Arquitectura Java - 20 Septiembre, 2016

    […] artículos relacionados :  Java Lambda , Java Streams , Java […]

  8. Java String pool , un concepto importante - Arquitectura Java - 25 Agosto, 2016

    […] Otros artículos relacionados: Java Fluid Interface ,  Java constructores this() vs super() , Java Lambda […]

  9. Utilizando Java High Order Functions - Arquitectura Java - 15 Agosto, 2016

    […] artículos relacionados : Java 8 Lambda ,Java Collections y […]

  10. Java 8 FlatMap y Streams - Arquitectura Java - 8 Julio, 2016

    […] artículos relacionados: Java Lambda , Java Reference Methods , Java […]

  11. Java Functional Interface - Arquitectura Java - 26 Febrero, 2016

    […] artículos relacionados: Java Lambda , Java Lambda Reduce ,Java Lambda […]

  12. Java Lambda reduce y wrappers - Arquitectura Java - 19 Enero, 2016

    […] artículos relacionados: Expresiones Lambda , JavaScript Reduce , Java Lambda […]

  13. El concepto de Java 8 reference method - Arquitectura Java - 20 Noviembre, 2015

    […] artículos relacionados:  Introducción a Lambda , Java Streams , Java Lambda WorkFlows , Oracle Java […]

  14. Novedades de Java 8 Collections y Listas - Arquitectura Java - 29 Octubre, 2015

    […] artículos relacionados: Java Lambda , Java Streams , Java Streams WorkFlows , Oracle Java […]

  15. Java 8 Stream y workflows - Arquitectura Java - 10 Septiembre, 2015

    […] Otros artículos relacionados: Programación funcional y Streams , Java 8 default Methods , Java 8 Lambda […]

  16. Java 8 Date Time API - Arquitectura Java - 9 Septiembre, 2015

    […] Otros artículos relacionados: ForEach vs Iterator , Expresiones Lambda ,JavaStreams […]

  17. Java 8 default methods y extensibilidad - Arquitectura Java - 15 Julio, 2015

    […] Java 8 Lambda , Java 8 Date Time , Java 8 Streams […]

  18. Programación Funcional, Java 8 Streams - Arquitectura Java - 28 Junio, 2015

    […] Artículos relacionados: Java Lambda ForEach, Introducción a Java Lambda , Java […]

  19. Java Collections List vs Set (I) - Arquitectura Java - 22 Junio, 2015

    […] Otros artículos relacionados : Java Generics , Java Generic y WildCards , Java Lambda […]

  20. Colecciones y Google Guava - Arquitectura Java - 22 Junio, 2015

    […] artículos relacionados : forEach vs Iterator, Java Lambda Expressions ,Uso de […]

  21. Utilizando un Java reference method - Arquitectura Java - 8 Abril, 2015

    […] artículos relacionados: Introducción a Java Lambda , Java Lambda forEach ,Java 8 Date […]

  22. Expresiones Lambda y ejecución en paralelo - Arquitectura Java - 3 Octubre, 2014

    […] Artículos relacionados: Expresiones Lambda ,Lambda ForEach, […]

  23. Java 8 Lambda y forEach (II) | Arquitectura JavaArquitectura Java - 13 Agosto, 2014

    […] artículos relacionados: Java y Expresiones Lambda ,Java […]

Deja un comentario