Guide de la carte multimédia goyave

Guide de la goyave Multimap

1. Vue d'ensemble

Dans cet article, nous examinerons l'une des implémentations deMap de la bibliothèque Google Guava -Multimap. C'est une collection qui mappe des clés à des valeurs, similaire àjava.util.Map, mais dans laquelle chaque clé peut être associée à plusieurs valeurs.

2. Dépendance Maven

Tout d'abord, ajoutons une dépendance:


    com.google.guava
    guava
    21.0

La dernière version peut être trouvéehere.

3. Implémentation deMultimap

Dans le cas de GuavaMultimap,, si nous ajoutons deux valeurs pour la même clé, la deuxième valeur ne remplacera pas la première valeur. Au lieu de cela, nous aurons deux valeurs dans lesmap résultants. Examinons un cas de test:

String key = "a-key";
Multimap map = ArrayListMultimap.create();

map.put(key, "firstValue");
map.put(key, "secondValue");

assertEquals(2, map.size());

L'impression du contenu demap produira:

{a-key=[firstValue, secondValue]}

Lorsque nous obtiendrons des valeurs par clé «a-key», nous obtiendronsCollection<String> qui contient «firstValue» et «secondValue» en conséquence:

Collection values = map.get(key);

Les valeurs d’impression donneront:

[firstValue, secondValue]

4. Par rapport auMap standard

La carte standard du packagejava.util ne nous permet pas d'attribuer plusieurs valeurs à la même clé. Considérons un cas simple où nousput() deux valeurs dans unMap en utilisant la même clé:

String key = "a-key";
Map map = new LinkedHashMap<>();

map.put(key, "firstValue");
map.put(key, "secondValue");

assertEquals(1, map.size());

Lemap résultant n'a qu'un seul élément (“secondValue”), en raison d'une deuxième opérationput() qui remplace la première valeur. Si nous voulons obtenir le même comportement qu'avec lesMultimap, de Guava, nous aurions besoin de créer unMap qui a unList<String> comme type de valeur:

String key = "a-key";
Map> map = new LinkedHashMap<>();

List values = map.get(key);
if(values == null) {
    values = new LinkedList<>();
    values.add("firstValue");
    values.add("secondValue");
 }

map.put(key, values);

assertEquals(1, map.size());

Évidemment, ce n’est pas très pratique à utiliser. Et si nous avons un tel besoin dans notre code, lesMultimap de Guava pourraient être un meilleur choix que lesjava.util.Map.

Une chose à noter ici est que, bien que nous ayons une liste qui contient deux éléments, la méthodesize() renvoie 1. InMultimap, size() renvoie un nombre réel de valeurs stockées dans unMap, maiskeySet().size() renvoie le nombre de clés distinctes.

5. Avantages deMultimap

Les multimaps sont couramment utilisés dans les endroits où unMap<K, Collection<V>> serait autrement apparu. Les différences incluent:

  • Il n'est pas nécessaire de remplir une collection vide avant d'ajouter une entrée avecput()

  • The get() method ne retourne jamaisnull, seulement une collection vide (nous n'avons pas besoin de vérifier par rapport ànull comme dans le cas de test deMap<String, Collection<V>>)

  • Une clé est contenue dans lesMultimap si et seulement si elle correspond à au moins une valeur. Toute opération qui fait qu'une clé a zéro valeur associée, a pour effet de supprimer cette clé desMultimap (enMap<String, Collection<V>>, même si nous supprimons toutes les valeurs de la collection, nous gardons toujours unCollection en tant que valeur, et c'est une surcharge de mémoire inutile)

  • Le nombre total de valeurs d'entrée est disponible ensize()

6. Conclusion

Cet article montre comment et quand utiliser GuavaMultimap. Il le compare auxjava.util.Map standard et montre les avantages de GuavaMultimap.

Tous ces exemples et extraits de code peuvent être trouvés dans leGitHub project - il s'agit d'un projet Maven, il devrait donc être facile à importer et à exécuter tel quel.