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