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);
GO TO FULL VERSION