Introduktion till CollectionUtils

En annan generisk verktygsklass som innehåller många användbara metoder:

addAll(Collection<C> collection, C...elements) Lägger till alla element i array C till samlingen
addIgnoreNull(Collection<T> collection, T-objekt) Lägger till ett element om det inte är null
containsAll(Samling<?> coll1, Collection<?> coll2) Kontrollerar att samling1 innehåller alla delar av samling2
containsAny(Collection<?> coll1, Collection<?> coll2) Kontrollerar att samling1 innehåller minst ett element från samling2
countMatches(Iterable<C> input, Predicate<? super C> predikat) Räknar hur många element i en samling som uppfyller en predikatregel
disjunction(Iterable<? förlänger O> a, Iterable<? förlänger O> b) Returnerar objekt som bara finns i en samling, men inte båda
intersection(Iterable<? sträcker sig O> a, Iterable<? sträcker sig O> b) Returnerar en samling objekt som ingår i båda samlingarna samtidigt
union(Iterable<? förlänger O> a, Iterable<? förlänger O> b) Returnerar en samling objekt som ingår i minst en samling
emptyCollection() Returnerar en speciell tom samling
emptyIfNull(Samling<T> samling) Returnerar en tom samling om samling == null
existerar (Iterable<C>-ingång, Predikat<? super C>-predikat) Kontrollerar om det finns ett element i samlingen som uppfyller predikatregeln
extraheraSingleton(Collection<E> collection) Returnerar det enda elementet i samlingen
filter (Iterable<T>-samling, Predikat<? super T>-predikat) Filtrerar elementen i en samling
find(Iterable<T>-samling, Predikat<? super T>-predikat) Letar du efter delar av en samling
isEmpty(Samling<?> koll) Kontrollerar om samlingen är tom
isEqualCollection(Samling<?> a, Samling<?> b) Jämför samlingar
isFull(Samling<? utökar Objekt> kolli) Kontrollerar om ett element fortfarande kan läggas till i samlingen
isNotEmpty(Collection<?> coll) Kontrollera om samlingen inte är tom
isSubCollection(Samling<?> a, Samling<?> b) Kontrollerar om samling B finns i samling A
matchesAll(Iterable<C> input, Predicate<? super C> predikat) Kontrollerar att alla element i en samling uppfyller en predikatregel
removeAll(Collection<E> collection, Collection<?> remove) Tar bort alla element i samlingen
retainAll(Collection<C> collection, Collection<?> retain) Returnerar en samling som innehåller alla delar av samlingen som också finns i retain
reverseArray(Object[] array) Vänder en array bakåt
unmodifiableCollection(Collection<? utökar C>-samlingen) Returnerar ett omslag över samlingen. Varje försök att modifiera samlingen leder till ett undantag.

Låt oss titta på några metoder.

Sätt att kontrollera om en samling är tom

Så här lätt är det att avgöra om en samling är tom:

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

Det är lika enkelt att kontrollera att en samling inte är tom:

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

Exempel:

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

En guide till Apache Commons Collections CollectionUtils

Operationer på uppsättningar

Om du var tvungen att hantera mängdlära, då vet du att det finns 4 grundläggande operationer på mängder: union, skärningspunkt, skillnad och disjunktion.

För dessa operationer har CollectionUtils -klassen fyra metoder:

  • union()
  • genomskärning()
  • åtskiljande()
  • subtrahera()

Nedan följer några enkla exempel:

En förening

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]

genomskärning

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]

Åtskiljande

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]

Skillnad (avdrag)

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]

Operationer på uppsättningar, fortsättning

Det här exemplet visar hur du använder de fyra ovanstående metoderna för att arbeta med två samlingar:

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()));

Vårt resultat:

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}

Du kan experimentera med dessa metoder på egen hand.

unmodifiableCollection() metod

Ibland behöver vi implementera gränssnittsmetoder som behöver returnera samlingar av våra objekts interna data. Och eftersom informationen är intern vill vi inte att någon ska ändra den någonstans.

Eller så har vi någonstans fått en samling som inte behöver ändras, utan som tvingas skicka den till någon tredjepartsmetod. Var finns garantin att han inte kommer att ändra det?

För att sova lugnt kan kollektionen slås in i ett speciellt omslag som kommer att göra ett undantag när man försöker modifiera kollektionen.

Exempel:

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]

Metoden Collections.unmodifiableCollection() returnerar ett omslag över samlingen som skickas till den. Om du anropar dess get() , size() -metoder , kommer allt att fungera. Men när du anropar metoderna add() , set() , remove() får du ett undantag.

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

Faktum är att metoden redan är markerad som utfasad och det rekommenderas att använda Collections.unmodifiableCollection(Collection<? förlänger T> c) istället .

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