专栏名称: 芋道源码
纯 Java 源码分享公众号,目前有「Dubbo」「SpringCloud」「Java 并发」「RocketMQ」「Sharding-JDBC」「MyCAT」「Elastic-Job」「SkyWalking」「Spring」等等
目录
相关文章推荐
Java编程精选  ·  Controller层代码这么写,简洁又优雅! ·  18 小时前  
芋道源码  ·  如何实现一个合格的分布式锁 ·  昨天  
51好读  ›  专栏  ›  芋道源码

Guava的这些骚操作,让我的代码量减少了50%

芋道源码  · 公众号  · Java  · 2025-05-17 21:53

主要观点总结

本文介绍了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]
[20282816]

2、计算key对应的所有value的和

以统计所有 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

3、转换rowKey和columnKey

这一操作也可以理解为行和列的转置,直接调用 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

4、转为嵌套的Map

还记得我们在没有使用 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/

BiMap - 双向Map

在普通 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

看上去很实用是不是?但是使用中还有几个坑得避一下,下面一个个梳理。

1、反转后操作的影响

上面我们用 inverse 方法反转了原来 BiMap 的键值映射,但是这个反转后的 BiMap 并不是一个新的对象,它实现了一种视图的关联,所以对反转后的 BiMap 执行的所有操作会作用于原先的 BiMap 上。

HashBiMap biMap = HashBiMap.create();
biMap.put("Hydra","Programmer");
biMap.put("Tony","IronMan"






请到「今天看啥」查看全文