Перейти к основному содержимому

Путеводитель по BiMap Гуавы

· 3 мин. чтения

1. Обзор

В этом руководстве мы покажем, как использовать интерфейс BiMap Google Guava и его многочисленные реализации.

BiMap ( или «двунаправленная карта») — это особый тип карты, который поддерживает инверсное представление карты, гарантируя отсутствие повторяющихся значений и всегда можно безопасно использовать значение для возврата ключа.

Базовой реализацией BiMap является HashBiMap , где внутренне он использует два Map , один для сопоставления ключа со значением, а другой для сопоставления значения с ключом.

2. BiMap Google Guava

Давайте посмотрим, как использовать класс BiMap .

Мы начнем с добавления зависимости библиотеки Google Guava в pom.xml :

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>

Последнюю версию зависимости можно проверить здесь .

3. Создание BiMap

Вы можете создать экземпляр BiMap несколькими способами:

  • Если вы собираетесь иметь дело с пользовательским объектом Java, используйте метод create из класса HashBiMap:
BiMap<String, String> capitalCountryBiMap = HashBiMap.create();
  • Если у нас уже есть существующая карта, вы можете создать экземпляр BiMap , используя перегруженную версию метода create из класса HashBiMap :
Map<String, String> capitalCountryBiMap = new HashMap<>();
//...
HashBiMap.create(capitalCountryBiMap);
  • Если вы собираетесь иметь дело с ключом типа Enum, используйте метод create из класса EnumHashBiMap :
BiMap<MyEnum, String> operationStringBiMap = EnumHashBiMap.create(MyEnum.class);
  • Если вы собираетесь создать неизменяемую карту, используйте класс ImmutableBiMap (который следует шаблону построителя):
BiMap<String, String> capitalCountryBiMap
= new ImmutableBiMap.Builder<>()
.put("New Delhi", "India")
.build();

4. Использование BiMap

Давайте начнем с простого примера, показывающего использование BiMap, где мы можем получить ключ на основе значения и значение на основе ключа:

@Test
public void givenBiMap_whenQueryByValue_shouldReturnKey() {
BiMap<String, String> 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);
}

Примечание. Обратный метод выше возвращает обратное представление BiMap , которое сопоставляет каждое из значений BiMap со связанными с ним ключами.

BiMap генерирует исключение IllegalArgumentException , когда мы дважды пытаемся сохранить повторяющееся значение.

Давайте посмотрим на пример того же:

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

Если мы хотим переопределить значение, уже присутствующее в BiMap , мы можем использовать метод forcePut :

@Test
public void givenSameValueIsPresent_whenForcePut_completesSuccessfully() {
BiMap<String, String> 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. Вывод

В этом кратком руководстве мы проиллюстрировали примеры использования BiMap в библиотеке Guava. Он преимущественно используется для получения ключа на основе значения из карты.

Реализацию этих примеров можно найти в проекте GitHub — это проект на основе Maven, поэтому его легко импортировать и запускать как есть.