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, поэтому его легко импортировать и запускать как есть.