Apache Commons Collections SetUtils

Apache Commons Collections SetUtils

1. Vue d'ensemble

Dans cet article, nous allons explorer l'APISetUtils de la bibliothèque Apache Commons Collections. En termes simples, ces utilitaires peuvent être utilisés pour exécuter certaines opérations sur les structures de donnéesSet en Java.

2. Installation de dépendance

Pour que nous puissions utiliser la bibliothèqueSetUtils dans notre projet, nous devons ajouter la dépendance suivante au fichierpom.xml de notre projet:


    org.apache.commons
    commons-collections4
    4.1

Sinon, si notre projet est basé sur Gradle, nous devons ajouter la dépendance au fichierbuild.gradle de notre projet. De plus, nous devons ajoutermavenCentral() à la section repositories du fichierbuild.gradle:

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

3. Ensemble prédéfini

La méthodepredicatedSet() de la bibliothèqueSetUtils permet de définir les conditions qui doivent être remplies par tous les éléments qui doivent être insérés dans un ensemble. Il accepte un objet sourceSet et un prédicat.

Nous pouvons l'utiliser pour valider facilement que tous les éléments d'unSet satisfont à une certaine condition, ce qui peut être pratique lors du développement d'une bibliothèque / API tierce.

Si la validation échoue pour un élément, unIllegalArgumentException sera renvoyé. L'extrait ci-dessousprevents the addition ofstrings that do not start with ‘L' dans lessourceSet ou lesvalidatingSet renvoyés:

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

La bibliothèque a égalementpredicatedSortedSet() etpredicatedNavigableSet() pour travailler respectivement avecSortedSet etNavigableSet.

4. Union, différence et intersection d'un ensemble

La bibliothèque a des méthodes qui peuvent calculer l'union, la différence et l'intersection des élémentsSet.

La méthodedifference() prend deux objetsSet et renvoie un objetSetUtils.SetView immuable. LeSetUtils.SetView renvoyé contient les éléments qui sont dans l'ensemblea mais pas dans l'ensembleb:

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

Notez que,trying to perform write operations, like add() or addAll(), on the returned SetUtils.SetView will throw an UnsupportedOperationException.

Pour modifier le résultat renvoyé, nous devons appeler la méthodetoSet() desSetUtils.SetView retournés pour obtenir un objetSet inscriptible:

Set mutableSet = result.toSet();

La méthodeunion de la bibliothèqueSetUtils fait exactement ce à quoi elle ressemble - elle renvoie tous les éléments de l'ensemblea etb. La méthodeunion renvoie également un objetSetUtil.SetView immuable:

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 utilisé dans l'instruction assert. C'est une méthode statique pratique de la bibliothèqueSetUtils qui vérifie efficacement si deux ensembles sont égaux.

Pour obtenir l'intersection d'un ensemble, c'est-à-dire éléments qui sont à la fois présents dans l'ensemblea et l'ensembleb, nous utiliserons la méthodeSetUtils.intersection(). Cette méthode renvoie également un objetSetUtil.SetView:

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

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

5. Transformer les éléments du set

Jetons un coup d'œil à une autre méthode intéressante -SetUtils.transformedSet(). Cette méthode accepte un objetSet et une interfaceTransformer. Soutenu par l'ensemble source, il utilise la méthodetransform() de l'interfaceTransformer pour transformer chaque élément d'un ensemble.

La logique de transformation est définie dans la méthodetransform() de l'interfaceTransformer, qui est appliquée à chaque élément ajouté à l'ensemble. L'extrait de code ci-dessous multiplie par 2 chaque élément ajouté à l'ensemble:

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

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

La méthodetransformedSet() est assez pratique - elle peut même être utilisée pour transtyper les éléments d'un ensemble - disons de String en Integer. Assurez-vous simplement que le type de sortie est un sous-type de l'entrée.

Disons que nous travaillons avecSortedSet ouNavigableSet au lieu deHashSet,, nous pouvons utiliser respectivement lestransformedSortedSet() outransformedNavigableSet().

Notez qu'une nouvelle instanceHashSet est transmise à la méthodetransformedSet(). Dans les situations où unSet non vide existant est passé à la méthode, les éléments préexistants ne seront pas transformés.

Si nous voulons transformer des éléments préexistants (et ceux ajoutés par la suite), nous devons utiliser la méthodetransformedSet() deorg.apache.commons.collections4.set.TransformedSet:

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

Notez que les éléments de l'ensemble source sont transformés et le résultat est copié dans lesnewSet. renvoyés

6. Définir la disjonction

La bibliothèqueSetUtils fournit une méthode statique qui peut être utilisée pour trouver des disjonctions d'ensemble. La disjonction de l'ensemblea et de l'ensembleb sont tous les éléments uniques pour l'ensemble a et l'ensemble b.

Voyons comment utiliser la méthodedisjunction() de la bibliothèqueSetUtils:

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. Autres méthodes de la bibliothèqueSetUtils

Il existe d'autres méthodes dans la bibliothèqueSetUtils qui facilitent le traitement des données d'ensemble:

  • Nous pouvons utiliser lessynchronizedSet() ousynchronizedSortedSet() pour obtenir unSet thread-safe. Cependant, comme indiqué dans la documentation, nousmust manually synchronize l'itérateur de l'ensemble retourné pour éviter un comportement non déterministe

  • Nous pouvons utiliser lesSetUtils.unmodifiableSet() pour obtenir un ensemble en lecture seule. Notez qu'une tentative d'ajout d'éléments à l'objetSet renvoyé lèvera unUnsupportedOperationException

  • Il existe également la méthodeSetUtils.emptySet() qui renvoie un ensemble vide immuable de type sécurisé

  • La méthodeSetUtils.emptyIfNull() accepte un objetSet nullable. Il renvoie un set vide, en lecture seule si leSet fourni est nul; sinon, il renvoie lesSet fournis

  • SetUtils.orderedSet() renverra un objetSet qui maintient l'ordre dans lequel les éléments sont ajoutés

  • SetUtils.hashCodeForSet() peut générer un hashcode pour un ensemble - de telle manière que deux ensembles des mêmes éléments auront le même hashcode

  • SetUtils.newIdentityHashSet() renverra unHashSet qui utilise== pour correspondre à un élément au lieu de la méthodeequals(). Veuillez lire ses mises en gardehere

8. Conclusion

Dans cet article, nous avons exploré les détails de la bibliothèqueSetUtils. La classe utilitaire propose des méthodes statiques qui facilitent et stimulent l'utilisation d'une structure de données définie. Cela augmente également la productivité.

Comme toujours, des extraits de code sont disponiblesover on GitHub. Le document officiel de l'APISetUtils peut êtrefound here.