Guide de Guava Multimap

1. Vue d'ensemble

Dans cet article, nous examinerons l'une des implémentations de Map de la bibliothèque Google Guava - Multimap . Il s'agit d'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 de Maven

Tout d'abord, ajoutons une dépendance:

 com.google.guava guava 29.0-jre 

La dernière version peut être trouvée ici.

3. Implémentation Multimap

Dans le cas de Guava Multimap, 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 la carte résultante . Regardons 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 de la carte produira:

{a-key=[firstValue, secondValue]}

Lorsque nous obtiendrons des valeurs par clé "a-key", nous obtiendrons une Collection qui contient "firstValue" et "secondValue" comme résultat:

Collection values = map.get(key);

Les valeurs d'impression sortiront:

[firstValue, secondValue]

4. Par rapport à la carte standard

La carte standard du package java.util ne nous donne pas la possibilité d'attribuer plusieurs valeurs à la même clé. Considérons un cas simple où nous mettons () deux valeurs dans une Map 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()); 

La mappe résultante n'a qu'un seul élément ( «secondValue»), en raison d'une deuxième opération put () qui remplace la première valeur. Si nous voulons obtenir le même comportement qu'avec le Multimap de Guava , nous aurions besoin de créer une carte qui a une liste 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());
    

De toute évidence, ce n'est pas très pratique à utiliser. Et si nous avons un tel besoin dans notre code, Multimap de Guava pourrait être un meilleur choix que java.util.Map.

Une chose à noter ici est que, bien que nous ayons une liste qui contient deux éléments, la méthode size () renvoie 1. Dans Multimap, size () renvoie un nombre réel de valeurs stockées dans une Map, mais keySet (). Size () renvoie le nombre de clés distinctes.

5. Avantages de Multimap

Les multimaps sont couramment utilisés dans les endroits où une carte autrement serait apparu. Les différences incluent:

  • Il n'est pas nécessaire de remplir une collection vide avant d'ajouter une entrée avec put ()
  • La méthode get () ne retourne jamais null , seulement une collection vide (nous n'avons pas besoin de vérifier par rapport à null comme dans Map cas de test)
  • Une clé est contenue dans le Multimap 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é de la carte multimédia (dans Map , même si nous supprimons toutes les valeurs de la collection, nous conservons toujours une Collection vide comme valeur, et c'est une surcharge de mémoire inutile)
  • Le nombre total de valeurs d'entrée est disponible sous la forme size ()

6. Conclusion

Cet article explique comment et quand utiliser Guava Multimap. Il le compare au standard java.util.Map et montre les pros de Guava Multimap.

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