Leitfaden zur Guava-BiMap

Leitfaden für die Guava BiMap

1. Überblick

In diesem Tutorial zeigen wir Ihnen, wie Sie dieBiMap-Schnittstelle von Google Guava und ihre zahlreichen Implementierungen verwenden.

ABiMap (oder „bidirektionale Karte“) ist eine spezielle Art einer Karte, die eine umgekehrte Ansicht der Karte beibehält und gleichzeitig sicherstellt, dass keine doppelten Werte vorhanden sind und ein Wert immer sicher verwendet werden kann, um den Schlüssel zurückzubekommen.

Die grundlegende Implementierung vonBiMap istHashBiMap, wobei intern zweiMaps verwendet werden, eines für die Zuordnung von Schlüssel zu Wert und das andere für die Zuordnung von Wert zu Schlüssel.

2. BiMapvon Google Guava

Schauen wir uns an, wie die KlasseBiMapverwendet wird.

Wir beginnen mit dem Hinzufügen der Google Guava-Bibliotheksabhängigkeit inpom.xml:


    com.google.guava
    guava
    21.0

Die neueste Version der Abhängigkeit kann inhere überprüft werden.

3. BiMap erstellen

Sie können eine Instanz vonBiMap auf verschiedene Arten erstellen:

  • Wenn Sie mit einem benutzerdefinierten Java-Objekt arbeiten möchten, verwenden Sie die Methodecreateaus der Klasse HashBiMap:

BiMap capitalCountryBiMap = HashBiMap.create();
  • Wenn bereits eine Map vorhanden ist, können Sie eine Instanz vonBiMap mit einer überladenen Version der Methodecreate aus einer KlasseHashBiMap erstellen:

Map capitalCountryBiMap = new HashMap<>();
//...
HashBiMap.create(capitalCountryBiMap);
  • Wenn Sie sich mit einem Schlüssel vom TypEnum,befassen, verwenden Sie die Methodecreate aus der KlasseEnumHashBiMap:

BiMap operationStringBiMap = EnumHashBiMap.create(MyEnum.class);
  • Wenn Sie eine unveränderliche Zuordnung erstellen möchten, verwenden Sie die KlasseImmutableBiMap(die einem Builder-Muster folgt):

BiMap capitalCountryBiMap
  = new ImmutableBiMap.Builder<>()
    .put("New Delhi", "India")
    .build();

4. Verwenden der BiMap

Beginnen wir mit einem einfachen Beispiel, das die Verwendung vonBiMap,zeigt, wobei wir einen Schlüssel basierend auf einem Wert und einen Wert basierend auf einem Schlüssel erhalten können:

@Test
public void givenBiMap_whenQueryByValue_shouldReturnKey() {
    BiMap capitalCountryBiMap = HashBiMap.create();
    capitalCountryBiMap.put("New Delhi", "India");
    capitalCountryBiMap.put("Washington, D.C.", "USA");
    capitalCountryBiMap.put("Moscow", "Russia");

    String keyFromBiMap = capitalCountryBiMap.inverse().get("Russia");
    String valueFromBiMap = capitalCountryBiMap.get("Washington, D.C.");

    assertEquals("Moscow", keyFromBiMap);
    assertEquals("USA", valueFromBiMap);
}

Hinweis: Die oben beschriebene Methodeinverse gibt die umgekehrte Ansicht derBiMap zurück, die jeden der BiMap-Werte den zugehörigen Schlüsseln zuordnet.

BiMap löst einIllegalArgumentException aus, wenn wir versuchen, einen doppelten Wert zweimal zu speichern.

Sehen wir uns ein Beispiel dafür an:

@Test(expected = IllegalArgumentException.class)
public void givenBiMap_whenSameValueIsPresent_shouldThrowException() {
    BiMap capitalCountryBiMap = HashBiMap.create();
    capitalCountryBiMap.put("Mumbai", "India");
    capitalCountryBiMap.put("Washington, D.C.", "USA");
    capitalCountryBiMap.put("Moscow", "Russia");
    capitalCountryBiMap.put("New Delhi", "India");
}

Wenn wir den bereits inBiMap vorhandenen Wert überschreiben möchten, können wir die MethodeforcePut verwenden:

@Test
public void givenSameValueIsPresent_whenForcePut_completesSuccessfully() {
    BiMap capitalCountryBiMap = HashBiMap.create();
    capitalCountryBiMap.put("Mumbai", "India");
    capitalCountryBiMap.put("Washington, D.C.", "USA");
    capitalCountryBiMap.put("Moscow", "Russia");
    capitalCountryBiMap.forcePut("New Delhi", "India");

    assertEquals("USA", capitalCountryBiMap.get("Washington, D.C."));
    assertEquals("Washington, D.C.", capitalCountryBiMap.inverse().get("USA"));
}

5. Fazit

In diesem kurzen Tutorial haben wir Beispiele für die Verwendung vonBiMap in der Guava-Bibliothek veranschaulicht. Es wird hauptsächlich verwendet, um einen Schlüssel basierend auf dem Wert aus der Karte abzurufen.

Die Implementierung dieser Beispiele finden Sie inthe GitHub project - dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein.