Introduktion til CollectionUtils

En anden generisk hjælpeklasse, der indeholder mange nyttige metoder:

addAll(Collection<C> collection, C...elements) Tilføjer alle elementer i array C til samlingen
addIgnoreNull(Samling<T>-samling, T-objekt) Tilføjer et element, hvis det ikke er null
containsAll(Samling<?> coll1, Collection<?> coll2) Kontrollerer, at samling1 indeholder alle elementer af samling2
containsAny(Collection<?> coll1, Collection<?> coll2) Kontrollerer, at samling1 indeholder mindst ét ​​element fra samling2
countMatches(Iterable<C> input, prædikat<? super C> prædikat) Tæller, hvor mange elementer i en samling, der opfylder en prædikatregel
disjunktion(Iterable<? forlænger O> a, Iterable<? forlænger O> b) Returnerer objekter, der kun er i én samling, men ikke begge
intersection(Iterable<? forlænger O> a, Iterable<? forlænger O> b) Returnerer en samling af objekter, der er en del af begge samlinger på én gang
union(Iterable<? forlænger O> a, Iterable<? forlænger O> b) Returnerer en samling af objekter, der er en del af mindst én samling
emptyCollection() Returnerer en særlig tom samling
emptyIfNull(Samling<T> samling) Returnerer en tom samling, hvis samling == null
eksisterer (Iterable<C> input, prædikat<? super C> prædikat) Kontrollerer, om der er et element i samlingen, der opfylder prædikatreglen
extractSingleton(Collection<E> collection) Returnerer det eneste element i samlingen
filter (Iterable<T> samling, prædikat<? super T> prædikat) Filtrerer elementerne i en samling
find(Iterable<T> samling, prædikat<? super T> prædikat) Leder efter elementer i en samling
isEmpty(Samling<?> samling) Tjekker om samlingen er tom
isEqualCollection(Samling<?> a, Samling<?> b) Sammenligner samlinger
isFull(Samling<? udvider Objekt> coll) Kontrollerer, om et element stadig kan tilføjes til samlingen
isNotEmpty(Samling<?> samling) Tjek om samlingen ikke er tom
isSubCollection(Samling<?> a, Samling<?> b) Tjekker om samling B er i samling A
matchesAll(Iterable<C> input, prædikat<? super C> prædikat) Kontrollerer, at alle elementer i en samling opfylder en prædikatregel
removeAll(Collection<E> collection, Collection<?> remove) Fjerner alle elementer i samlingen
retainAll(Collection<C> collection, Collection<?> retain) Returnerer en samling, der indeholder alle elementer af samlingen, som også er indeholdt i retain
reverseArray(Objekt[] array) Vender et array bagud
unmodifiableCollection(Collection<? udvider C>-samlingen) Returnerer en indpakning over samlingen. Ethvert forsøg på at ændre samlingen vil give en undtagelse.

Lad os se på nogle metoder.

Måder at kontrollere, om en samling er tom

Her er, hvor nemt det er at afgøre, om en samling er tom:

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

Det er lige så nemt at kontrollere, at en samling ikke er tom:

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

Eksempler:

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 til Apache Commons Collections CollectionUtils

Operationer på sæt

Hvis du skulle beskæftige dig med mængdelære, så ved du, at der er 4 grundlæggende operationer på mængder: forening, skæring, differens og disjunktion.

Til disse operationer har CollectionUtils -klassen 4 metoder:

  • Union()
  • vejkryds()
  • disjunktion()
  • trække fra()

Nedenfor er nogle simple eksempler:

En forening

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]

vejkryds

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]

Disjunktion

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]

Forskel (fradrag)

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å sæt, fortsat

Dette eksempel viser, hvordan du bruger ovenstående fire metoder til at arbejde med to samlinger:

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

Vores 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 eksperimentere med disse metoder på egen hånd.

unmodifiableCollection() metode

Nogle gange er vi nødt til at implementere grænseflademetoder, der skal returnere samlinger af vores objekters interne data. Og da dataene er interne, ønsker vi ikke, at nogen skal ændre dem et sted.

Eller vi har modtaget et sted en samling, der ikke skal ændres, men som er tvunget til at videregive den til en tredjepartsmetode. Hvor er garantien for, at han ikke vil ændre det?

For at sove roligt, kan kollektionen pakkes ind i en speciel indpakning, der vil give en undtagelse, når du forsøger at ændre kollektionen.

Eksempel:

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]

Collections.unmodifiableCollection() -metoden returnerer en indpakning over samlingen, der er sendt til den. Hvis du kalder dens get() , size()- metoder , vil alt fungere. Men når du kalder add() , set() , remove() metoderne , får du en undtagelse.

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

Faktisk er metoden allerede markeret som forældet, og det anbefales at bruge Collections.unmodifiableCollection(Collection<? udvider T> c) i stedet for .

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