Eine Anleitung zu Apache Commons Collections CollectionUtils

Dieser Artikel ist Teil einer Reihe: • Apache Commons Collections Bag

• SetUtils für Apache Commons-Sammlungen

• OrderedMap für Apache Commons-Sammlungen

• Apache Commons-Sammlungen BidiMap

• Eine Anleitung zu Apache Commons Collections CollectionUtils (aktueller Artikel) • Apache Commons Collections MapUtils

• Leitfaden zu Apache Commons CircularFifoQueue

1. Übersicht

Einfach ausgedrückt, bietet Apache CollectionUtils Dienstprogrammmethoden für allgemeine Vorgänge, die eine Vielzahl von Anwendungsfällen abdecken und dabei helfen, das Schreiben von Boilerplate-Code zu vermeiden. Die Bibliothek zielt auf ältere JVM-Versionen ab, da derzeit ähnliche Funktionen von der Stream- API von Java 8 bereitgestellt werden .

2. Maven-Abhängigkeiten

Wir müssen die folgende Abhängigkeit hinzufügen, um mit CollectionUtils beginnen zu können:

 org.apache.commons commons-collections4 4.1 

Die neueste Version der Bibliothek finden Sie hier.

3. Setup

Fügen wir Kunden- und Adressklassen hinzu:

public class Customer { private Integer id; private String name; private Address address; // standard getters and setters } public class Address { private String locality; private String city; // standard getters and setters }

Wir halten auch praktisch , um die folgenden Kunden und Liste Instanzen bereit , unsere Implementierung zu testen:

Customer customer1 = new Customer(1, "Daniel", "locality1", "city1"); Customer customer2 = new Customer(2, "Fredrik", "locality2", "city2"); Customer customer3 = new Customer(3, "Kyle", "locality3", "city3"); Customer customer4 = new Customer(4, "Bob", "locality4", "city4"); Customer customer5 = new Customer(5, "Cat", "locality5", "city5"); Customer customer6 = new Customer(6, "John", "locality6", "city6"); List list1 = Arrays.asList(customer1, customer2, customer3); List list2 = Arrays.asList(customer4, customer5, customer6); List list3 = Arrays.asList(customer1, customer2); List linkedList1 = new LinkedList(list1);

4. CollectionUtils

Lassen Sie uns einige der am häufigsten verwendeten Methoden in der Apache Commons CollectionUtils- Klasse durchgehen .

4.1. Nur Nicht-Null-Elemente hinzufügen

Wir können die addIgnoreNull- Methode von CollectionUtils verwenden, um einer bereitgestellten Sammlung nur Nicht-Null-Elemente hinzuzufügen.

Das erste Argument für diese Methode ist die Auflistung, zu der wir das Element hinzufügen möchten, und das zweite Argument ist das Element, das wir hinzufügen möchten:

@Test public void givenList_whenAddIgnoreNull_thenNoNullAdded() { CollectionUtils.addIgnoreNull(list1, null); assertFalse(list1.contains(null)); }

Beachten Sie, dass die Null nicht zur Liste hinzugefügt wurde.

4.2. Listen zusammenstellen

Wir können die Sortiermethode verwenden, um zwei bereits sortierte Listen zu sortieren. Diese Methode verwendet beide Listen, die wir zusammenführen möchten, als Argumente und gibt eine einzelne sortierte Liste zurück:

@Test public void givenTwoSortedLists_whenCollated_thenSorted() { List sortedList = CollectionUtils.collate(list1, list2); assertEquals(6, sortedList.size()); assertTrue(sortedList.get(0).getName().equals("Bob")); assertTrue(sortedList.get(2).getName().equals("Daniel")); }

4.3. Objekte transformieren

Wir können die Transformationsmethode verwenden, um Objekte der Klasse A in verschiedene Objekte der Klasse B zu transformieren. Diese Methode verwendet eine Liste von Objekten der Klasse A und einen Transformator als Argumente.

Das Ergebnis dieser Operation ist eine Liste von Objekten der Klasse B:

@Test public void givenListOfCustomers_whenTransformed_thenListOfAddress() { Collection addressCol = CollectionUtils.collect(list1, new Transformer() { public Address transform(Customer customer) { return customer.getAddress(); } }); List addressList = new ArrayList(addressCol); assertTrue(addressList.size() == 3); assertTrue(addressList.get(0).getLocality().equals("locality1")); }

4.4. Objekte filtern

Mit dem Filter können wir Objekte aus einer Liste entfernen, die eine bestimmte Bedingung nicht erfüllen . Die Methode verwendet die Liste als erstes Argument und ein Prädikat als zweites Argument.

Die filterInverse- Methode macht das Gegenteil. Es entfernt Objekte aus der Liste, wenn das Prädikat true zurückgibt.

Sowohl filter als auch filterInverse geben true zurück, wenn die Eingabeliste geändert wurde, dh wenn mindestens ein Objekt aus der Liste herausgefiltert wurde:

@Test public void givenCustomerList_WhenFiltered_thenCorrectSize() { boolean isModified = CollectionUtils.filter(linkedList1, new Predicate() { public boolean evaluate(Customer customer) { return Arrays.asList("Daniel","Kyle").contains(customer.getName()); } }); assertTrue(linkedList1.size() == 2); }

Wir können select und selectRejected verwenden, wenn die resultierende Liste anstelle eines booleschen Flags zurückgegeben werden soll.

4.5. Auf Nicht leer prüfen

Die isNotEmpty- Methode ist sehr praktisch, wenn wir überprüfen möchten, ob eine Liste mindestens ein einzelnes Element enthält. Die andere Möglichkeit, dies zu überprüfen, ist:

boolean isNotEmpty = (list != null && list.size() > 0);

Obwohl die obige Codezeile dasselbe tut, hält CollectionUtils.isNotEmpty unseren Code sauberer:

@Test public void givenNonEmptyList_whenCheckedIsNotEmpty_thenTrue() { assertTrue(CollectionUtils.isNotEmpty(list1)); }

Das isEmpty macht das Gegenteil. Es wird geprüft, ob die angegebene Liste null ist oder ob die Liste null Elemente enthält:

List emptyList = new ArrayList(); List nullList = null; assertTrue(CollectionUtils.isEmpty(nullList)); assertTrue(CollectionUtils.isEmpty(emptyList));

4.6. Einschluss prüfen

Mit isSubCollection können wir überprüfen, ob eine Sammlung in einer anderen Sammlung enthalten ist. isSubCollection verwendet zwei Sammlungen als Argumente und gibt true zurück , wenn die erste Sammlung eine Untersammlung der zweiten Sammlung ist:

@Test public void givenCustomerListAndASubcollection_whenChecked_thenTrue() { assertTrue(CollectionUtils.isSubCollection(list3, list1)); }

A collection is sub-collection of another collection if the number of times an object occurs in the first collection is less than or equal to the number of times it occurs in the second collection.

4.7. Intersection of Collections

We can use CollectionUtils.intersection method to get the intersection of two collections. This method takes two collections and returns a collection of elements of which are common in both the input collections:

@Test public void givenTwoLists_whenIntersected_thenCheckSize() { Collection intersection = CollectionUtils.intersection(list1, list3); assertTrue(intersection.size() == 2); }

The number of times an element occurs in the resultant collection is a minimum of the number of times it occurs in each of the given collections.

4.8. Subtracting Collections

CollectionUtils.subtract takes two collections as input and returns a collection which contains elements which are there in the first collection but not in the second collection:

@Test public void givenTwoLists_whenSubtracted_thenCheckElementNotPresentInA() { Collection result = CollectionUtils.subtract(list1, list3); assertFalse(result.contains(customer1)); }

The number of times a collection occurs in the result is the number of times it occurs in first collection minus the number of times it occurs in the second collection.

4.9. Union of Collections

CollectionUtils.union does the union of two collections and returns a collection which contains all the elements which are there in either the first or the second collection.

@Test public void givenTwoLists_whenUnioned_thenCheckElementPresentInResult() { Collection union = CollectionUtils.union(list1, list2); assertTrue(union.contains(customer1)); assertTrue(union.contains(customer4)); }

The number of times an element occurs in the resulting collection is the maximum of the number of times it occurs in each of the given collections.

5. Conclusion

And we're done.

We went through some of the commonly used methods of CollectionUtils – which is very much useful to avoid boilerplate when we're working with collections in our Java projects.

As usual, the code is available over on GitHub.

Weiter » Apache Commons-Sammlungen MapUtils « Vorherige Apache Commons-Sammlungen BidiMap