Introdução ao CollectionUtils
Outra classe utilitária genérica que contém muitos métodos úteis:
addAll(Collection<C> collection, C...elements) | Adiciona todos os elementos da matriz C à coleção |
addIgnoreNull(coleção Collection<T>, objeto T) | Adiciona um elemento se não for nulo |
contémAll(Coleção<?>coll1, Coleção<?>coll2) | Verifica se a coleção1 contém todos os elementos da coleção2 |
contémAny(Coleção<?>coll1, Coleção<?>coll2) | Verifica se a coleção1 contém pelo menos um elemento da coleção2 |
countMatches(Iterable<C> input, Predicate<? super C> predicate) | Conta quantos elementos em uma coleção satisfazem uma regra de predicado |
disjunction(Iterable<? extends O> a, Iterable<? extends O> b) | Retorna objetos que estão em apenas uma coleção, mas não em ambas |
interseção(Iterável<? estende O> a, Iterável<? estende O> b) | Retorna uma coleção de objetos que fazem parte de ambas as coleções ao mesmo tempo |
union(Iterable<? extends O> a, Iterable<? extends O> b) | Retorna uma coleção de objetos que fazem parte de pelo menos uma coleção |
coleçãovazia() | Retorna uma coleção vazia especial |
emptyIfNull(Coleção<T> coleção) | Retorna uma coleção vazia se coleção == null |
existe(Iterable<C> input, Predicate<? super C> predicate) | Verifica se existe um elemento na coleção que satisfaça a regra do predicado |
extractSingleton(coleção<E> coleção) | Retorna o único elemento da coleção |
filter(Iterable<T> collection, Predicate<? super T> predicate) | Filtra os elementos de uma coleção |
find(Iterable<T> collection, Predicate<? super T> predicate) | Procurando elementos de uma coleção |
isEmpty(Collection<?>coll) | Verifica se a coleção está vazia |
isEqualCollection(Coleção<?> a, Coleção<?> b) | Compara coleções |
isFull(Collection<? extends Object> coll) | Verifica se um elemento ainda pode ser adicionado à coleção |
isNotEmpty(Collection<?>coll) | Verifique se a coleção não está vazia |
isSubCollection(Coleção<?> a, Coleção<?> b) | Verifica se a coleção B está na coleção A |
matchAll(Iterable<C> input, Predicate<? super C> predicate) | Verifica se todos os elementos de uma coleção satisfazem uma regra de predicado |
removeAll(Coleção<E> coleção, Coleção<?> remover) | Remove todos os elementos da coleção |
reterAll(Coleção<C> coleção, Coleção<?> reter) | Retorna uma coleção contendo todos os elementos da coleção que também estão contidos em reter |
reverseArray(Object[] array) | Inverte uma matriz para trás |
unmodificávelCollection(Collection<? extends C> collection) | Retorna um wrapper sobre a coleção. Qualquer tentativa de modificar a coleção gerará uma exceção. |
Vejamos alguns métodos.
Maneiras de verificar se uma coleção está vazia
Veja como é fácil determinar se uma coleção está vazia:
CollectionUtils.isEmpty(null); // true
CollectionUtils.isEmpty(new LinkedList<>()); // true
CollectionUtils.isEmpty(Collections.singleton(new int[]{2, 1})); // false
É igualmente fácil verificar se uma coleção não está vazia:
CollectionUtils.isNotEmpty(null); // false
CollectionUtils.isNotEmpty(new LinkedList<>()); // false
CollectionUtils.isNotEmpty(Collections.singleton(new int[]{2, 1})); // true
Exemplos:
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
Um guia para coleções do Apache Commons CollectionUtils
Operações em conjuntos
Se você teve que lidar com a teoria dos conjuntos, sabe que existem 4 operações básicas sobre conjuntos: união, interseção, diferença e disjunção.
Para essas operações, a classe CollectionUtils possui 4 métodos:
- União()
- interseção()
- disjunção()
- subtrair()
Abaixo estão alguns exemplos simples:
Uma associação
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]
interseção
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]
Disjunção
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]
Diferença (dedução)
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]
Operações em sets, continuação
Este exemplo mostra como usar os quatro métodos acima para trabalhar com duas coleções:
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()));
Nosso 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}
Você pode experimentar esses métodos por conta própria.
Método não modificávelCollection()
Às vezes, precisamos implementar métodos de interface que precisam retornar coleções de dados internos de nossos objetos. E como os dados são internos, não queremos que ninguém os altere em algum lugar.
Ou recebemos em algum lugar uma coleção que não precisa ser alterada, mas somos forçados a passá-la para algum método de terceiros. Onde está a garantia de que ele não vai mudar isso?
Para dormir pacificamente, a coleção pode ser empacotada em um wrapper especial que lançará uma exceção ao tentar modificar a coleção.
Exemplo:
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]
O método Collections.unmodifiableCollection() retorna um wrapper sobre a coleção passada para ele. Se você chamar seus métodos get() , size() , tudo funcionará. No entanto, ao chamar os métodos add() , set() , remove() , você receberá uma exceção.
java.lang.UnsupportedOperationException
at org.apache.commons.collections.collection.UnmodifiableCollection.add(UnmodifiableCollection.java:75)
Na verdade, o método já está marcado como obsoleto e é recomendável usar Collections.unmodifiableCollection(Collection<? extends T> c) .
Collection<String> firstCollection = new ArrayList<String>();
Collection<String> secondCollection =
Collections.unmodifiableCollection(firstCollection);
GO TO FULL VERSION