Eclipse Collections para impacientes


Eclipse collections es una librería de colecciones para Java. Su foco esta en la productividad y performance, y para ello nos brinda un conjunto de APIs y tipos. El protocolo de iteración fue basado en el framework de colecciones de Smalltalk y es totalmente compatible con los tipos del framework Collection de Java. 

¿Porqué Eclipse Collections?


  • Productividad 
    • Enriquecido, funcional y APIs con gran simetría
    • List, Set, Bag, Stack, Map, Multimap, BiMap, Interval Types
    • Tipos Readable, Mutable e Inmutable
    • Collection Factories Mutable e Inmutable
    • Adaptadores y clases utilitarias para tipos JCF
  • Performance
    • Contenedores eficientes en memoria
    • Optimizado Eager, Lazy y APIs Parallel
    • Collections de Primitivos para todos los tipos primitivos.
  • Desarrollo activo desde el 2005.


Aprender eclipse collections


La guía en github esta super detallada, pero, mi intención es facilitarles aún  más la prueba de este gran proyecto.


1. Creamos un proyecto maven con esta configuración:


Y muy importante el plugin para trabajar con compiler versión 1.8+:



2. Creamos una Clase Person.java y un test para validar que esta todo ok.

En src/main/java creamos la clase Person.java: 



El src/test/java el test correspondiente:


Y al ejecutar el resultado es:



La intención del ejemplo es:

Crear una lista MutableList con tres instancias de la clase Person. Luego se coleccionara sus apellidos (lastName) en una nueva lista  MutableList, para finalmente obtener como salida los nombres separados con coma usando makeString.



        MutableList people = Lists.mutable.with(
                new Person("Sally", "Smith"),
                new Person("Ted", "Watson"),
                new Person("Mary", "Williams"));
        MutableList lastNames = people.collect(person =>; person.getLastName());
        Assert.assertEquals("Smith, Watson, Williams", lastNames.makeString());
El lambda se puede reemplazar con:


MutableList lastNames = people.collect(Person::getLastName);


3. Se puede crear también una lista Inmutable ya que Eclipse Collections lo soporta.




        ImmutableList people = Lists. immutable.with(
                new Person("Sally", "Smith"),
                new Person("Ted", "Watson"),
                new Person("Mary", "Williams"));
        ImmutableList lastNames = people.collect(person ->; person.getLastName());
        Assert.assertEquals("Smith, Watson, Williams", lastNames.makeString());





4. Eclipse Collections viene también con un lazy API, el cual esta disponible cuando invocamos el método asLazy. El método collect retornara ahora un LazyIterable. Dicho LazyIterable retornado no evaluará nada hasta que algún método terminal sea invocado. Con lo dicho anteriormente, la llamada a makeString forzará recién que el  LazyIterable coleccione los apellidos.


...
LazyIterable lastNames = people.asLazy().collect(Person::getLastName);
Assert.assertEquals("Smith, Watson, Williams", lastNames.makeString());



5. Select / Reject (filtrar / no filtrar)

Podemos filtrar a las personas con el apellido "Smith" usando el método select.




MutableList people = Lists.mutable.with(
        new Person("Sally", "Smith"),
        new Person("Ted", "Watson"),
        new Person("Mary", "Williams"));
MutableList smiths = people.select(person -> person.lastNameEquals("Smith"));
Assert.assertEquals("Smith", smiths.collect(Person::getLastName).makeString());








Si a la inversa, queremos encontrar a las personas que no tienen apellido "Smith", usamos el método reject.




        MutableList people = Lists.mutable.with(
                new Person("Sally", "Smith"),
                new Person("Ted", "Watson"),
                new Person("Mary", "Williams"));
        MutableList notSmiths = people.reject(person -> person.lastNameEquals("Smith"));
        Assert.assertEquals("Watson, Williams", notSmiths.collect(Person::getLastName).makeString());




6. Any / All / None

Nosotros podemos también probar any (alguno), all (todos) o none (ninguno) de los elementos de una colección dada una condición.

Any:

    MutableList people = Lists.mutable.with(
                new Person("Sally", "Smith"),
                new Person("Ted", "Watson"),
                new Person("Mary", "Williams"));

        Assert.assertTrue(people.anySatisfy(person -> person.lastNameEquals("Smith")));
        Assert.assertTrue(people.anySatisfyWith(Person::lastNameEquals, "Smith"));



All:



  MutableList people = Lists.mutable.with(
                new Person("Sally", "Smith"),
                new Person("Ted", "Watson"),
                new Person("Mary", "Williams"));

        Assert.assertFalse(people.allSatisfy(person -> person.lastNameEquals("Smith")));
        Assert.assertFalse(people.allSatisfyWith(Person::lastNameEquals, "Smith"));




None:



        MutableList people = Lists.mutable.with(
                new Person("Sally", "Smith"),
                new Person("Ted", "Watson"),
                new Person("Mary", "Williams"));

        Assert.assertFalse(people.noneSatisfy(person -> person.lastNameEquals("Smith")));
        Assert.assertFalse(people.noneSatisfyWith(Person::lastNameEquals, "Smith"));




Katas de eclipse collections


De aquí ya puedes continuar con las excelentes katas que existen en este repositorio de github: https://github.com/eclipse/eclipse-collections-kata

Hay dos en particular:  Pet Kata (sigue las  instrucciones de dicha Kata) y Company Kata con sus instrucciones también.


Enjoy!

Joe









Share:

0 comentarios:

Publicar un comentario