Ein Handbuch zu Apache Commons Collections CollectionUtils

Ein Leitfaden zu Apache Commons Collections CollectionUtils

1. Überblick

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

2. Maven-Abhängigkeiten

Wir müssen die folgende Abhängigkeit hinzufügen, um mitCollectionUtils: loszulegen


    org.apache.commons
    commons-collections4
    4.1

Die neueste Version der Bibliothek finden Sie unterhere.

3. Konfiguration

Fügen wirCustomer undAddress classes: 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 werden auch die folgenden Instanzen vonCustomer undListbereithalten, um 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 KlasseApache Commons CollectionUtilsdurchgehen.

4.1. Nur Nicht-Null-Elemente hinzufügen

Wir können die MethodeCollectionUtils’s addIgnoreNullverwenden, um einer bereitgestellten Sammlung nur Nicht-Null-Elemente hinzuzufügen.

Das erste Argument für diese Methode ist die Auflistung, zu der das Element hinzugefügt werden soll, und das zweite Argument ist das Element, das hinzugefügt werden soll:

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

    assertFalse(list1.contains(null));
}

Beachten Sie, dassnull nicht zur Liste hinzugefügt wurde.

4.2. Listen zusammenstellen

We can use collate method to collate two already sorted lists. 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 Methodetransform verwenden, um Objekte der Klasse A in verschiedene Objekte der Klasse B umzuwandeln. Diese Methode verwendet eine Liste von Objekten der Klasse A und atransformer 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

Using filter we can remove objects which do not satisfy a given condition from a list. Die Methode verwendet die Liste als erstes Argument undPredicate als zweites Argument.

The filterInverse method does the opposite. Entfernt Objekte aus der Liste, wennPredicate true zurückgibt.

Sowohlfilter als auchfilterInverse gebentrue zurück, wenn die Eingabeliste geändert wurde, d. H. 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önnenselect undselectRejected verwenden, wenn die resultierende Liste anstelle eines booleschen Flags zurückgegeben werden soll.

4.5. Auf Nicht leer prüfen

The isNotEmpty method is quite handy when we want to check if there is at least single element in a list. Die andere Möglichkeit, dies zu überprüfen, ist:

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

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

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

The isEmpty does the opposite. Es wird geprüft, ob die angegebene Liste null ist oder keine Elemente in der Liste enthalten sind:

List emptyList = new ArrayList<>();
List nullList = null;

assertTrue(CollectionUtils.isEmpty(nullList));
assertTrue(CollectionUtils.isEmpty(emptyList));

4.6. Einschluss prüfen

Wir könnenisSubCollection verwenden, um zu überprüfen, ob eine Sammlung in einer anderen Sammlung enthalten ist. isSubCollection verwendet zwei Sammlungen als Argumente und gibttrue zurück, wenn die erste Sammlung eine Untersammlung der zweiten Sammlung ist:

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

Eine Sammlung ist eine Untersammlung einer anderen Sammlung, wenn die Häufigkeit, mit der ein Objekt in der ersten Sammlung vorkommt, kleiner oder gleich der Häufigkeit ist, mit der es in der zweiten Sammlung vorkommt.

4.7. Schnittpunkt von Sammlungen

We can use CollectionUtils.intersection method to get the intersection of two collections. Diese Methode verwendet zwei Sammlungen und gibt eine Sammlung von Elementen zurück, von denen beide Eingabesammlungen gemeinsam sind:

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

Die Häufigkeit, mit der ein Element in der resultierenden Auflistung vorkommt, entspricht mindestens der Häufigkeit, mit der es in jeder der angegebenen Auflistungen vorkommt.

4.8. Sammlungen subtrahieren

CollectionUtils.subtract nimmt zwei Sammlungen als Eingabe und gibt eine Sammlung zurück, die Elemente enthält, die in der ersten Sammlung, aber nicht in der zweiten Sammlung vorhanden sind:

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

Die Häufigkeit, mit der eine Sammlung im Ergebnis auftritt, ist die Häufigkeit, mit der sie in der ersten Sammlung auftritt, abzüglich der Häufigkeit, mit der sie in der zweiten Sammlung auftritt.

4.9. Union der Sammlungen

CollectionUtils.union führt die Vereinigung zweier Sammlungen durch und gibt eine Sammlung zurück, die alle Elemente enthält, die entweder in der ersten oder in der zweiten Sammlung vorhanden sind.

@Test
public void givenTwoLists_whenUnioned_thenCheckElementPresentInResult() {
    Collection union = CollectionUtils.union(list1, list2);

    assertTrue(union.contains(customer1));
    assertTrue(union.contains(customer4));
}

Die Häufigkeit, mit der ein Element in der resultierenden Auflistung vorkommt, ist das Maximum der Häufigkeit, mit der es in jeder der angegebenen Auflistungen vorkommt.

5. Fazit

Und wir sind fertig.

Wir haben einige der häufig verwendeten Methoden vonCollectionUtils durchlaufen - was sehr nützlich ist, um Boilerplate zu vermeiden, wenn wir mit Sammlungen in unseren Java-Projekten arbeiten.

Wie üblich ist der Codeover on GitHub. verfügbar