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