Initialisation de HashSet au moment de la construction

1. Vue d'ensemble

Dans ce rapide tutoriel, nous présenterons différentes méthodes d' initialisation du HashSet avec des valeurs, au moment de sa construction .

Si vous cherchez plutôt à explorer les fonctionnalités de HashSet , reportez-vous à cet article principal ici.

Nous allons plonger dans les méthodes intégrées de Java depuis Java 5 et avant, suivies d'un nouveau mécanisme introduit depuis Java 8 . Nous verrons également une méthode utilitaire personnalisée et explorerons enfin les fonctionnalités fournies par les bibliothèques de collections tierces , Google Guava en particulier.

Si vous avez de la chance d'avoir déjà migré vers JDK9 +, vous pouvez simplement utiliser les méthodes de fabrique de collections.

2. Méthodes intégrées Java

Commençons par examiner trois mécanismes intégrés disponibles depuis Java 5 ou avant .

2.1. Utilisation d'une autre instance de collection

Nous pouvons passer une instance existante d'une autre collection pour initialiser l' ensemble . Dans l'exemple ci-dessous, nous utilisons une liste créée en ligne :

Set set = new HashSet(Arrays.asList("a", "b", "c"));

2.2. Utilisation de la classe anonyme

Dans encore une autre approche, nous pouvons utiliser la classe anonyme pour ajouter un élément à HashSet .

Notez l'utilisation de doubles accolades. Cette approche est techniquement très coûteuse car elle crée une classe anonyme à chaque fois qu'elle est appelée.

Donc, en fonction de la fréquence à laquelle nous devons initialiser Set, nous pouvons essayer d'éviter d'utiliser cette approche:

Set set = new HashSet(){{ add("a"); add("b"); add("c"); }};

2.3. Utilisation de la méthode de l'utilitaire de collections depuis Java 5

La classe d' utilitaire Java's Collections fournit la méthode nommée singleton pour créer un Set avec un seul élément . L' instance Set créée avec la méthode singleton est immuable, ce qui signifie que nous ne pouvons pas lui ajouter plus de valeurs.

Il existe des situations en particulier dans les tests unitaires où nous devons créer un ensemble avec une seule valeur:

Set set = Collections.singleton("a");

3. Définition de la méthode de l'utilitaire personnalisé

Nous pouvons définir une méthode finale statique comme ci-dessous. La méthode accepte des arguments variables .

L'utilisation de Collections.addAll qui accepte l'objet de collection et un tableau de valeurs est la meilleure entre autres en raison de la faible surcharge de copie des valeurs.

La méthode utilise des génériques afin que nous puissions transmettre des valeurs de tout type:

public static final  Set newHashSet(T... objs) { Set set = new HashSet(); Collections.addAll(set, objs); return set; }

La méthode utilitaire peut être utilisée dans notre code comme ci-dessous.

Set set = newHashSet("a","b","c");

4. Utilisation de Stream depuis Java 8

Avec l'introduction de Stream API dans Java 8, nous avons des options supplémentaires. Nous pouvons utiliser Stream avec des collecteurs comme indiqué dans le code ci-dessous:

Set set = Stream.of("a", "b", "c") .collect(Collectors.toCollection(HashSet::new));

5. Utilisation de la bibliothèque de collections tierce

Il existe plusieurs bibliothèques de collections tierces, notamment Google Guava, Apache Commons Collections et Eclipse Collections, pour n'en nommer que quelques-unes.

Ces bibliothèques fournissent des méthodes utilitaires pratiques pour initialiser des collections telles que Set. Puisque Google Guava est l'un des plus couramment utilisés, nous en avons un exemple. Le Guava a des méthodes pratiques pour les objets Set mutables et immuables :

Set set = Sets.newHashSet("a", "b", "c");

De même, Guava a une classe utilitaire pour créer des instances Set immuables , comme nous pouvons le voir dans l'exemple ci-dessous.

Set set = ImmutableSet.of("a", "b", "c");

6. Conclusion

En conclusion, nous avons vu plusieurs façons dont un HashSet peut être initialisé pendant sa construction. Ces approches ne couvrent pas nécessairement toutes les manières possibles, par aucun moyen. C'était juste une tentative de présenter les moyens les plus courants.

Une de ces approches non abordées ici pourrait être l'utilisation du générateur d'objets pour construire un ensemble .

Comme toujours, un exemple de code fonctionnel est disponible sur GitHub.