Guava Bimap简介
Contents
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>31.0.1-jre</version>
</dependency>
可以在此处 检查最新版本的依赖项。
3. 创建 BiMap
您可以通过多种方式创建BiMap的实例,如下所示:
- 如果要处理自定义 Java 对象,请使用HashBiMap 类的create方法:
BiMap<String, String> capitalCountryBiMap = HashBiMap.create();
- 如果我们已经有一个现有的Map,您可以使用类HashBiMap的create方法的重载版本创建BiMap的实例:
Map<String, String> capitalCountryBiMap = new HashMap<>();
//...
HashBiMap.create(capitalCountryBiMap);
- 如果要处理Enum 类型的键,请使用EnumHashBiMap类的create方法:
BiMap<MyEnum, String> operationStringBiMap = EnumHashBiMap.create(MyEnum.class);
- 如果您打算创建不可变Map,请使用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"));
}