Introducción a CollectionUtils

Otra clase de utilidad genérica que contiene muchos métodos útiles:

addAll(Colección<C> colección, C...elementos) Agrega todos los elementos de la matriz C a la colección.
addIgnoreNull(Colección<T> colección, objeto T) Agrega un elemento si no es nulo
contieneTodo(Colección<?> coll1, Colección<?> coll2) Comprueba que la colección 1 contiene todos los elementos de la colección 2
contieneCualquiera(Colección<?> coll1, Colección<?> coll2) Comprueba que la colección 1 contiene al menos un elemento de la colección 2
countMatches(Iterable<C> input, Predicate<? super C> predicate) Cuenta cuántos elementos en una colección satisfacen una regla de predicado
disyunción(Iterable<? extiende O> a, Iterable<? extiende O> b) Devuelve objetos que están en una sola colección, pero no en ambas
intersección(Iterable<? extiende O> a, Iterable<? extiende O> b) Devuelve una colección de objetos que forman parte de ambas colecciones a la vez.
union(Iterable<? extiende O> a, Iterable<? extiende O> b) Devuelve una colección de objetos que forman parte de al menos una colección.
colecciónvacia() Devuelve una colección especial vacía.
emptyIfNull(Colección<T> colección) Devuelve una colección vacía si colección == nulo
existe (entrada iterable <C>, predicado <? super C> predicado) Comprueba si hay un elemento en la colección que satisfaga la regla de predicado
extractSingleton(Colección<E> colección) Devuelve el único elemento de la colección.
filtro (colección iterable <T>, predicado <? super T> predicado) Filtra los elementos de una colección.
find(Iterable<T> colección, Predicado<? super T> predicado) Buscando elementos de una colección.
estáVacío(Colección<?> coll) Comprueba si la colección está vacía.
isEqualCollection(Colección<?> a, Colección<?> b) Compara colecciones
isFull(Colección<? extiende Objeto> coll) Comprueba si un elemento aún se puede agregar a la colección
isNotEmpty(Colección<?> coll) Comprobar si la colección no está vacía
isSubCollection(Colección<?> a, Colección<?> b) Comprueba si la colección B está en la colección A
matchesAll(Iterable<C> input, Predicate<? super C> predicate) Comprueba que todos los elementos de una colección cumplen una regla de predicado
eliminarTodo(Colección<E> colección, Colección<?> eliminar) Elimina todos los elementos de la colección.
retenerTodo(Colección<C> colección, Colección<?> retener) Devuelve una colección que contiene todos los elementos de la colección que también están contenidos en retener
reverseArray(Objeto[] matriz) Invierte una matriz al revés
nomodificableCollection(Colección<? extiende la colección C>) Devuelve un contenedor sobre la colección. Cualquier intento de modificar la colección generará una excepción.

Veamos algunos métodos.

Formas de comprobar si una colección está vacía

Así de fácil es determinar si una colección está vacía:

CollectionUtils.isEmpty(null); // true
CollectionUtils.isEmpty(new LinkedList<>()); // true
CollectionUtils.isEmpty(Collections.singleton(new int[]{2, 1})); // false

Es igual de fácil verificar que una colección no esté vacía:

CollectionUtils.isNotEmpty(null); // false
CollectionUtils.isNotEmpty(new LinkedList<>()); // false
CollectionUtils.isNotEmpty(Collections.singleton(new int[]{2, 1})); // true

Ejemplos:

User ivan = new User("Ivan", "ivan@email.com");
User petr = new User("Petr", "petr@email.com");

List<User> users = new ArrayList<>();

System.out.println(CollectionUtils.isEmpty(users)); // true
System.out.println(CollectionUtils.isNotEmpty(users)); // false

users.add(ivan);
users.add(petr);

System.out.println(CollectionUtils.isEmpty(users)); // false
System.out.println(CollectionUtils.isNotEmpty(users)); // true

users = null;
System.out.println(CollectionUtils.isEmpty(users)); // true
System.out.println(CollectionUtils.isNotEmpty(users)); // false

Una guía para las colecciones de Apache Commons CollectionUtils

Operaciones sobre conjuntos

Si tuviste que lidiar con la teoría de conjuntos, entonces sabes que hay 4 operaciones básicas en conjuntos: unión, intersección, diferencia y disyunción.

Para estas operaciones, la clase CollectionUtils tiene 4 métodos:

  • Unión()
  • intersección()
  • disyunción()
  • sustraer()

A continuación se muestran algunos ejemplos simples:

Una asociación

List<String> firstList = Arrays.asList("1", "2", "3", "4", "5", "6");
List<String> secondList = Arrays.asList("2", "3", "6", "7", "8", "9");

//combine two sets
Collection<String> result = CollectionUtils.union(firstList, secondList);
System.out.println(ArrayUtils.toString(result));     //[1, 2, 3, 4, 5, 6, 7, 8, 9]

intersección

List<String> firstList = Arrays.asList("A", "B", "C", "D", "E", "F");
List<String> secondList = Arrays.asList("B", "D", "F", "G", "H", "K");

//intersections of two sets
Collection<String> result = CollectionUtils.intersection(firstList, secondList);
System.out.println(ArrayUtils.toString(result));     //[B, D, F]

Disyunción

List<String> firstList = Arrays.asList("1", "2", "3", "4", "5", "6");
List<String> secondList = Arrays.asList("2", "3", "6", "7", "8", "9");

//disjunction
Collection<String> result = CollectionUtils.disjunction(firstList, secondList);
System.out.println(ArrayUtils.toString(result)); //[1, 4, 5, 7, 8, 9]

Diferencia (deducción)

List<String> firstList = Arrays.asList("1", "2", "3", "4", "5", "6");
List<String> secondList = Arrays.asList("2", "3", "6", "7", "8", "9");

//difference
Collection<String> result = CollectionUtils.subtract(firstList, secondList);
System.out.println(ArrayUtils.toString(result)); // [1, 4, 5]

Operaciones en conjuntos, continuación

Este ejemplo muestra cómo usar los cuatro métodos anteriores para trabajar con dos colecciones:

List<Integer> firstList = Arrays.asList(1, 2, 3, 3, 4, 5);
List<Integer> secondList = Arrays.asList(3, 4, 4, 5, 6, 7);

Collection<Integer> union = CollectionUtils.union(firstList, secondList); // An association
Collection<Integer> intersection = CollectionUtils.intersection(firstList, secondList); // Intersection
Collection<Integer> disjunction = CollectionUtils.disjunction(firstList, secondList); // disjunction
Collection<Integer> subtract = CollectionUtils.subtract(firstList, secondList); // Difference

System.out.println("firstList: " + ArrayUtils.toString(firstList.toArray()));
System.out.println("secondList: " + ArrayUtils.toString(secondList.toArray()));

System.out.println("An association: " + ArrayUtils.toString(union.toArray()));
System.out.println("Intersection: " + ArrayUtils.toString(intersection.toArray()));
System.out.println("Disjunction: " + ArrayUtils.toString(disjunction.toArray()));
System.out.println("Difference: " + ArrayUtils.toString(subtract.toArray()));

Nuestro resultado:

firstList: {1,2,3,3,4,5}
secondList: {3,4,4,5,6,7}
An association: {1,2,3,3,4,4,5,6,7}
intersection: {3,4,5}
Disjunction: {1,2,3,4,6,7}
Difference: {1,2,3}

Puedes experimentar con estos métodos por tu cuenta.

Método no modificableCollection()

A veces necesitamos implementar métodos de interfaz que necesitan devolver colecciones de datos internos de nuestros objetos. Y dado que los datos son internos, no queremos que nadie los cambie en ninguna parte.

O tenemos una colección en algún lugar que no necesita ser cambiada, pero nos vemos obligados a pasarla a algún método de terceros. ¿Dónde está la garantía de que no lo cambiará?

Para poder dormir tranquilo, la colección se puede envolver en un envoltorio especial que lanzará una excepción al intentar modificar la colección.

Ejemplo:

Collection<String> firstCollection = new ArrayList<String>();
Collection<String> secondCollection = Collections.unmodifiableCollection(firstCollection);
firstCollection.add("hello");
firstCollection.add("from");
firstCollection.add("codeGym");

//secondCollection.add("have a error");
System.out.println(secondCollection); //[hello, from, codeGym]

El método Collections.unmodifiableCollection() devuelve un contenedor sobre la colección que se le pasa. Si llama a sus métodos get() , size() , entonces todo funcionará. Sin embargo, al llamar a los métodos add() , set() , remove() , obtendrá una excepción.

java.lang.UnsupportedOperationException
at org.apache.commons.collections.collection.UnmodifiableCollection.add(UnmodifiableCollection.java:75)

De hecho, el método ya está marcado como obsoleto y se recomienda usar Collections.unmodifiableCollection(Collection<? extends T> c) en su lugar .

Collection<String> firstCollection = new ArrayList<String>();
Collection<String> secondCollection =
Collections.unmodifiableCollection(firstCollection);