Gids voor Guava Multimap

1. Overzicht

In dit artikel zullen we een van de Kaart implementaties van Google Guava-bibliotheek - Multimap. Het is een verzameling die sleutels toewijst aan waarden, vergelijkbaar met java.util.Map, maar waarbij elke sleutel kan worden geassocieerd met meerdere waarden.

2. Maven Afhankelijkheid

Laten we eerst een afhankelijkheid toevoegen:

 com.google.guava guave 29.0-jre 

De laatste versie vind je hier.

3. Multimap Implementatie

In het geval van Guava Multimap, als we twee waarden voor dezelfde sleutel optellen, zal de tweede waarde de eerste waarde niet overschrijven. In plaats daarvan hebben we twee waarden in het resulterende kaart. Laten we een testcase bekijken:

String key = "a-key"; Multimap-kaart = ArrayListMultimap.create (); map.put (key, "firstValue"); map.put (key, "secondValue"); assertEquals (2, map.size ()); 

Afdrukken van het kaart‘S inhoud wordt weergegeven:

{a-key = [firstValue, secondValue]}

Wanneer we waarden krijgen met de sleutel "a-sleutel", zullen we krijgen Verzameling die als resultaat "firstValue" en "secondValue" bevat:

Verzamelingswaarden = map.get (sleutel);

Afdrukwaarden worden uitgevoerd:

[firstValue, secondValue]

4. Vergeleken met de standaard Kaart

Standaard kaart van java.util pakket geeft ons niet de mogelijkheid om meerdere waarden aan dezelfde sleutel toe te wijzen. Laten we eens kijken naar een eenvoudig geval als we leggen() twee waarden in een Kaart met dezelfde sleutel:

String key = "a-key"; Map map = nieuwe LinkedHashMap (); map.put (key, "firstValue"); map.put (key, "secondValue"); assertEquals (1, map.size ()); 

Het resultaat kaart heeft slechts één element ("SecondValue"), vanwege een seconde leggen() bewerking die de eerste waarde overschrijft. Moeten we hetzelfde gedrag willen bereiken als bij Guava's Multimap, we zouden een Kaart dat heeft een Lijst als waardetype:

String key = "a-key"; Kaart map = nieuwe LinkedHashMap (); Lijstwaarden = map.get (key); if (waarden == null) {waarden = nieuwe LinkedList (); waarden.add ("firstValue"); waarden.add ("secondValue"); } map.put (sleutel, waarden); assertEquals (1, map.size ());

Het is duidelijk niet erg handig in gebruik. En als we zo'n behoefte in onze code hebben, dan is dat van Guava Multimap zou een betere keuze kunnen zijn dan java.util.Map.

Een ding dat hier moet worden opgemerkt, is dat, hoewel we een lijst hebben met twee elementen erin, grootte() methode retourneert 1. In Multimap, maat () geeft een werkelijk aantal waarden terug dat is opgeslagen in een Kaart, maar keySet (). size () geeft het aantal verschillende sleutels terug.

5. Voordelen van Multimap

Multimaps worden vaak gebruikt op plaatsen waar een Kaart zou anders zijn verschenen. De verschillen zijn onder meer:

  • Het is niet nodig om een ​​lege collectie te vullen voordat u een item toevoegt met leggen()
  • De methode get () keert nooit terug nul, alleen een lege collectie (we hoeven niet te controleren nul als in Kaart testcase)
  • Een sleutel is opgenomen in het Multimap als en slechts als het wordt toegewezen aan ten minste één waarde. Elke bewerking die ervoor zorgt dat een sleutel nul bijbehorende waarden heeft, heeft tot gevolg dat die sleutel uit het Multimap (in Kaart, zelfs als we alle waarden uit de verzameling verwijderen, houden we nog steeds een leeg Verzameling als een waarde, en dit is onnodige geheugenoverhead)
  • Het totale aantal invoerwaarden is beschikbaar als grootte()

6. Conclusie

Dit artikel laat zien hoe en wanneer je Guava moet gebruiken Multimap. Het vergelijkt het met standaard java.util.Map en toont pro's van Guava Multimap.

Al deze voorbeelden en codefragmenten zijn te vinden in het GitHub-project - dit is een Maven-project, dus het moet gemakkelijk te importeren en uit te voeren zijn zoals het is.