1. 概述
在这个教程中,我们将展示如何使用Google Guava库中的BiMap
接口及其多种实现。
BiMap
(或称为“双向映射”)是一种特殊的映射类型,它维护了映射的反向视图,并确保不存在重复值,且始终可以安全地使用值获取对应的键。
BiMap
的基本实现是HashBiMap
,它内部使用两个Map
,一个用于键到值的映射,另一个用于值到键的映射。
2. Google Guava的BiMap
让我们来看看如何使用BiMap
类。
首先,在pom.xml
中添加Google Guava库的依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.1.3-jre</version>
</dependency>
最新的依赖版本可以在这里查看。
3. 创建BiMap
你可以通过多种方式创建BiMap
实例:
- 如果你将处理自定义Java对象,可以使用
HashBiMap
类的create
方法:
BiMap<String, String> capitalCountryBiMap = HashBiMap.create();
- 如果你已经有了现有的映射,可以使用
HashBiMap
类的重载create
方法创建BiMap
实例:
Map<String, String> capitalCountryBiMap = new HashMap<>();
//...
HashBiMap.create(capitalCountryBiMap);
- 如果你打算处理枚举类型的键,可以使用
EnumHashBiMap
类的create
方法:
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);
}
注意:上面的inverse
方法返回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. 总结
在这篇简短的教程中,我们展示了在Guava库中使用BiMap
的例子。它主要被用来根据映射中的值获取键。
这些示例的实现可以在GitHub项目中找到——这是一个基于Maven的项目,可以直接导入并运行。