Comparator
, podemos hacerlo también mediante programación funcional. Para comenzar, usaremos el objeto Persona
y la colección de personas que tenemos en el post sobre Colecciones en Java.En primer lugar usaremos el ordenamiento estándar con la clase
Persona
, en la que la clase implementa la interfaz Comparator
de modo que debe existir un método llamado compareTo
el cual podemos usar para ordenar por defecto.Al crear un
ArrayList personas=new ArrayList();
, este tiene un método llamado sort(Comparator comparator)
y por tanto necesitamos un objeto de este tipo con el que ordenar los elementos de la lista, de modo que tenemos que crear una clase Comparator
public class ComparatorByName implements Comparator{ @Override public int compare(Persona o1, Persona o2) { return o1.compareTo(o2); } }
o podemos instanciar el objeto desde el argumento del método sort
, generando el bloque de código con el método compareTo
ArrayList personas=new ArrayList(); personas.sort(new Comparator() { @Override public int compare(Persona o1, Persona o2) { return o1.compareTo(o2); } });
Con programación funcional, todo se vuelve más fácil, en el siguiente ejemplo creamos dos objetos Comparator
a los que le pasamos dos argumentos de los dos objetos a comparar que coincide con la firma del método de comparación del objeto original, pudiendo incluso aprovechar los métodos compareTo
de la clase String
para crear nuestro comparador personalizado.
Comparator comparatorEstandar= (pa, pb)-> pa.compareTo(pb); Comparator comparatorByName= (pa, pb)-> pa.getNombre().compareTo(pb.getNombre()); personas.sort(comparatorByName); personas.sort(comparatorEstandar);
Com ya vimos en el post Colecciones, mediante stream podemos ordenar con:
- Método de la clase
- Añadiendo un objeto
Comparator
creado mediante programación funcional o estándar - Añadiendo a la expresión lambda dos parámetros y la comparación.
personas.stream(). sorted(). forEach(p-> System.out.println(p.getFullName())); personas.stream(). sorted(comparatorByName). forEach(p-> System.out.println(p.getFullName())); personas.stream(). sorted((pa,pb)-> pa.getNombre().compareTo(pb.getNombre())). forEach(p-> System.out.println(p.getFullName()));
Por último para rizar el rizo… y ¿si queremos ordenar por varios campos, por ejemplo primero por apellido y después por edad? esto es posible con el método thenComparing
para añadir un nuevo orden con otro comparador anidado.
Comparator<Persona> comparatorByNameAndAge= comparatorByName.thenComparing((p0,p1)->p0.compareTo(p1));. forEach(p-> System.out.println(p.getFullName()));