Apache Commons Collections SetUtils

Apache Commons Collections SetUtils

1. Überblick

In diesem Artikel untersuchen wir dieSetUtils-API der Apache Commons Collections-Bibliothek. Einfach ausgedrückt können diese Dienstprogramme verwendet werden, um bestimmte Operationen anSet-Datenstrukturen in Java auszuführen.

2. Abhängigkeitsinstallation

Damit wir dieSetUtils-Bibliothek in unserem Projekt verwenden können, müssen wir derpom.xml-Datei unseres Projekts die folgende Abhängigkeit hinzufügen:


    org.apache.commons
    commons-collections4
    4.1

Wenn unser Projekt auf Gradle basiert, sollten wir alternativ die Abhängigkeit zurbuild.gradle-Datei unseres Projekts hinzufügen. Außerdem müssen wirmavenCentral() zum Repositorys-Abschnitt derbuild.gradle-Datei hinzufügen:

compile 'org.apache.commons:commons-collections4:4.1'

3. Prädiziertes Set

DiepredicatedSet()-Methode derSetUtils-Bibliothek ermöglicht das Definieren von Bedingungen, die von allen Elementen erfüllt werden sollen, die in eine Menge eingefügt werden sollen. Es akzeptiert das Objekt einer QuelleSetund ein Prädikat.

Wir können dies verwenden, um leicht zu überprüfen, ob alle Elemente vonSet eine bestimmte Bedingung erfüllen, was bei der Entwicklung einer Bibliothek / API eines Drittanbieters hilfreich sein kann.

Wenn die Validierung für ein Element fehlschlägt, wird einIllegalArgumentException ausgelöst. Das Snippet unterprevents the addition ofstrings that do not start with ‘L' insourceSet oder die zurückgegebenenvalidatingSet:

Set validatingSet
  = SetUtils.predicatedSet(sourceSet, s -> s.startsWith("L"));

Die Bibliothek verfügt auch überpredicatedSortedSet() undpredicatedNavigableSet() für die Arbeit mitSortedSet bzw.NavigableSet.

4. Vereinigung, Differenz und Schnittmenge einer Menge

Die Bibliothek verfügt über Methoden, mit denen die Vereinigung, die Differenz und der Schnittpunkt derSet-Elemente berechnet werden können.

Die Methodedifference() nimmt zweiSet Objekte und gibt ein unveränderlichesSetUtils.SetView Objekt zurück. Das zurückgegebeneSetUtils.SetView enthält die Elemente, die sich in Satza befinden, jedoch nicht in Satzb:

Set a = new HashSet<>(Arrays.asList(1, 2, 5));
Set b = new HashSet<>(Arrays.asList(1, 2));
SetUtils.SetView result = SetUtils.difference(a, b);

assertTrue(result.size() == 1 && result.contains(5));

Beachten Sie, dasstrying to perform write operations, like add() or addAll(), on the returned SetUtils.SetView will throw an UnsupportedOperationException.

Um das zurückgegebene Ergebnis zu ändern, müssen wir die MethodetoSet() der zurückgegebenenSetUtils.SetView aufrufen, um ein beschreibbaresSet-Objekt zu erhalten:

Set mutableSet = result.toSet();

Dieunion-Methode derSetUtils-Bibliothek macht genau das, wonach es sich anhört - sie gibt alle Elemente der Mengea undb zurück. Die Methodeunion gibt auch ein ObjektSetUtil.SetViewzurück, das unveränderlich ist:

Set expected = new HashSet<>(Arrays.asList(1, 2, 5));
SetUtils.SetView union = SetUtils.union(a, b);

assertTrue(SetUtils.isEqualSet(expected, union));

Take note of the isEqualSet() method wird in der assert-Anweisung verwendet. Es ist eine bequeme statische Methode derSetUtils-Bibliothek, die effektiv prüft, ob zwei Sätze gleich sind.

Um den Schnittpunkt einer Menge zu erhalten, d.h. Für Elemente, die sowohl in seta als auch in setb vorhanden sind, verwenden wir dieSetUtils.intersection()-Methode. Diese Methode gibt auch das ObjektSetUtil.SetViewzurück:

Set expected = new HashSet<>(Arrays.asList(1, 2));
SetUtils.SetView intersect = SetUtils.intersection(a, b);

assertTrue(SetUtils.isEqualSet(expected, intersect));

5. Set-Elemente transformieren

Schauen wir uns eine andere aufregende Methode an -SetUtils.transformedSet(). Diese Methode akzeptiert einSet-Objekt und eineTransformer-Schnittstelle. Unterstützt vom Quellensatz verwendet es dietransform()-Methode derTransformer-Schnittstelle, um jedes Element eines Satzes zu transformieren.

Die Transformationslogik wird in dertransform()-Methode derTransformer-Schnittstelle definiert, die auf jedes der Menge hinzugefügte Element angewendet wird. Das folgende Code-Snippet multipliziert jedes zum Set hinzugefügte Element mit 2:

Set a = SetUtils.transformedSet(new HashSet<>(), e -> e * 2  );
a.add(2);

assertEquals(a.toArray()[0], 4);

Die MethodetransformedSet()ist ziemlich praktisch - sie kann sogar zum Umwandeln von Elementen einer Menge verwendet werden - beispielsweise von String zu Integer. Stellen Sie einfach sicher, dass der Typ der Ausgabe ein Subtyp der Eingabe ist.

Nehmen wir an, wir arbeiten mitSortedSet oderNavigableSet anstelle vonHashSet,. Wir könnentransformedSortedSet() bzw.transformedNavigableSet() verwenden.

Beachten Sie, dass eine neue Instanz vonHashSetan die Methode vontransformedSet()übergeben wird. In Situationen, in denen ein vorhandenes, nicht leeresSet an die Methode übergeben wird, werden die bereits vorhandenen Elemente nicht transformiert.

Wenn wir bereits vorhandene Elemente (und die danach hinzugefügten) transformieren möchten, müssen wir dietransformedSet()-Methode vonorg.apache.commons.collections4.set.TransformedSet verwenden:

Set source = new HashSet<>(Arrays.asList(1));
Set newSet = TransformedSet.transformedSet(source, e -> e * 2);

assertEquals(newSet.toArray()[0], 2);
assertEquals(source.toArray()[0], 2);

Beachten Sie, dass Elemente aus dem Quellensatz transformiert werden und das Ergebnis in die zurückgegebenennewSet. kopiert wird

6. Disjunktion einstellen

DieSetUtils-Bibliothek bietet eine statische Methode, mit der festgelegte Disjunktionen gefunden werden können. Die Disjunktion von seta und setb sind alle Elemente, die für set a und set b eindeutig sind.

Lassen Sie uns sehen, wie die Methodedisjunction()der BibliothekSetUtilsverwendet wird:

Set a = new HashSet<>(Arrays.asList(1, 2, 5));
Set b = new HashSet<>(Arrays.asList(1, 2, 3));
SetUtils.SetView result = SetUtils.disjunction(a, b);

assertTrue(
  result.toSet().contains(5) && result.toSet().contains(3));

7. Andere Methoden inSetUtils Bibliothek

Es gibt andere Methoden in derSetUtils-Bibliothek, die die Verarbeitung festgelegter Daten zum Kinderspiel machen:

  • Wir könnensynchronizedSet() odersynchronizedSortedSet() verwenden, um ein thread-sicheresSet zu erhalten. Wie in den Dokumenten angegeben, istmust manually synchronizeder Iterator der zurückgegebenen Menge, um nicht deterministisches Verhalten zu vermeiden

  • Wir könnenSetUtils.unmodifiableSet() verwenden, um eine schreibgeschützte Menge zu erhalten. Beachten Sie, dass ein Versuch, Elemente zum zurückgegebenenSet-Objekt hinzuzufügen, einUnsupportedOperationException auslöst

  • Es gibt auch die MethodeSetUtils.emptySet(), die eine typsichere, unveränderliche leere Menge zurückgibt

  • Die MethodeSetUtils.emptyIfNull() akzeptiert ein nullbaresSet-Objekt. Es gibt ein leeres, schreibgeschütztes Set zurück, wenn das angegebeneSet null ist. Andernfalls werden die angegebenenSet zurückgegeben

  • SetUtils.orderedSet() gibt einSet-Objekt zurück, das die Reihenfolge beibehält, in der Elemente hinzugefügt werden

  • SetUtils.hashCodeForSet() kann einen Hashcode für eine Menge generieren - so, dass zwei Mengen derselben Elemente denselben Hashcode haben

  • SetUtils.newIdentityHashSet() gibt einHashSet zurück, das== verwendet, um ein Element anstelle derequals()-Methode abzugleichen. Bitte lesen Sie über die Vorbehaltehere

8. Fazit

In diesem Artikel haben wir uns mit dem Kern derSetUtils-Bibliothek befasst. Die Utility-Klasse bietet statische Methoden, die das Arbeiten mit einer festgelegten Datenstruktur einfach und aufregend machen. Es steigert auch die Produktivität.

Wie immer sind Codefragmenteover on GitHub verfügbar. Das offizielle Dokument für dieSetUtils-API kannfound here sein.