Руководство по Guava BiMap

Путеводитель по Guava BiMap

1. обзор

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

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

Базовая реализацияBiMap - этоHashBiMap, где внутренне он использует дваMaps, один для отображения ключа в значение, а другой для отображения значения в ключ.

2. BiMap в Google Guava

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

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


    com.google.guava
    guava
    21.0

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

3. Создание биокарты

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

  • Если вы собираетесь иметь дело с настраиваемым объектом Java, используйте методcreate из класса HashBiMap:

BiMap capitalCountryBiMap = HashBiMap.create();
  • Если у нас уже есть существующая карта, вы можете создать экземплярBiMap, используя перегруженную версию методаcreate из классаHashBiMap:

Map capitalCountryBiMap = new HashMap<>();
//...
HashBiMap.create(capitalCountryBiMap);
  • Если вы собираетесь иметь дело с ключом типаEnum,, используйте методcreate из классаEnumHashBiMap:

BiMap operationStringBiMap = EnumHashBiMap.create(MyEnum.class);
  • Если вы собираетесь создать неизменяемую карту, используйте классImmutableBiMap (который следует шаблону построителя):

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

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

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

@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);
}

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

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

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

@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");
}

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

@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. Заключение

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

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