主要观点总结
本文介绍了Guava中对Map的五种扩展数据结构,包括Table、BiMap、Multimap、RangeMap和ClassToInstanceMap,它们提供了实用的功能来简化代码。同时,也提到了使用这些数据结构时需要注意的坑,例如修改关联的视图会影响原始数据等。最后总结了这些工具的使用场景和注意事项,并推荐了加入其知识星球获取更多技术提升的机会。
关键观点总结
关键观点1: Table
Table允许一个value对应两个key,简化复杂数据结构的存储和访问。
关键观点2: BiMap
BiMap提供了key和value双向关联的数据结构,方便根据key或value相互查找。
关键观点3: Multimap
Multimap允许一个key映射到多个value,适用于需要存储多个值的情况。
关键观点4: RangeMap
RangeMap描述区间到特定值的映射关系,适用于根据范围分类的情况。
关键观点5: ClassToInstanceMap
ClassToInstanceMap以Class为键,实例对象为值,提供方便的实例缓存和获取。
正文
//rowKey或columnKey的集合
Set rowKeys = table.rowKeySet();
Set columnKeys = table.columnKeySet();
//value集合
Collection values = table.values();
分别打印它们的结果,
key
的集合是不包含重复元素的,
value
集合则包含了所有元素并没有去重:
[Hydra, Trunks]
[Jan, Feb]
[20, 28, 28, 16]
以统计所有
rowKey
对应的
value
之和为例:
for (String key : table.rowKeySet()) {
Set> rows = table.row(key).entrySet();
int total = 0;
for (Map.Entry row : rows) {
total += row.getValue();
}
System.out.println(key + ": " + total);
}
打印结果:
Hydra: 48
Trunks: 44
这一操作也可以理解为行和列的转置,直接调用
Tables
的静态方法
transpose
:
Table table2 = Tables.transpose(table);
Set> cells = table2.cellSet();
cells.forEach(cell->
System.out.println(cell.getRowKey()+","+cell.getColumnKey()+":"+cell.getValue())
);
利用
cellSet
方法可以得到所有的数据行,打印结果,可以看到
row
和
column
发生了互换:
Jan,Hydra:20
Feb,Hydra:28
Jan,Trunks:28
Feb,Trunks:16
还记得我们在没有使用
Table
前存储数据的格式吗,如果想要将数据还原成嵌套
Map
的那种形式,使用
Table
的
rowMap
或
columnMap
方法就可以实现了:
Map> rowMap = table.rowMap();
Map> columnMap = table.columnMap();
查看转换格式后的
Map
中的内容,分别按照行和列进行了汇总:
{Hydra={Jan=20, Feb=28}, Trunks={Jan=28, Feb=16}}
{Jan={Hydra=20, Trunks=28}, Feb={Hydra=28, Trunks=16}}
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
-
项目地址:https://github.com/YunaiV/ruoyi-vue-pro
-
视频教程:https://doc.iocoder.cn/video/
在普通
Map
中,如果要想根据
value
查找对应的
key
,没什么简便的办法,无论是使用
for
循环还是迭代器,都需要遍历整个
Map
。以循环
keySet
的方式为例:
public List findKey(Map map, String val){
List keys=new ArrayList<>();
for (String key : map.keySet()) {
if (map.get(key).equals(val))
keys.add(key);
}
return keys;
}
而guava中的
BiMap
提供了一种
key
和
value
双向关联的数据结构,先看一个简单的例子:
HashBiMap biMap = HashBiMap.create();
biMap.put("Hydra","Programmer");
biMap.put("Tony","IronMan");
biMap.put("Thanos","Titan");
//使用key获取value
System.out.println(biMap.get("Tony"));
BiMap inverse = biMap.inverse();
//使用value获取key
System.out.println(inverse.get("Titan"));
执行结果,:
IronMan
Thanos
看上去很实用是不是?但是使用中还有几个坑得避一下,下面一个个梳理。
上面我们用
inverse
方法反转了原来
BiMap
的键值映射,但是这个反转后的
BiMap
并不是一个新的对象,它实现了一种视图的关联,所以对反转后的
BiMap
执行的所有操作会作用于原先的
BiMap
上。
HashBiMap biMap = HashBiMap.create();
biMap.put("Hydra","Programmer");
biMap.put("Tony","IronMan"