Guava中独特的Map操作

本文介绍了Guava库中四种独特的Map操作:Table提供双键Map功能,方便处理二维数据;BiMap实现了双向Map,支持快速通过value查找key;RangeMap用于区间映射,简化条件判断;ClassToInstanceMap则是类型安全的实例Map。通过实例演示,展示了这些工具类如何提升Java开发效率。
摘要由CSDN通过智能技术生成

前言

Guava 是 Google 公司开发的一款 Java 类库扩展工具包,内含了丰富的 API,涵盖了集合、缓存、并发、I/O 等多个方面。

使用这些 API 一方面可以简化我们代码,使代码更为优雅,另一方面它补充了很多 jdk 中没有的功能,能让我们开发中更为高效。

今天我要给大家分享的就是 Guava 中封装的一些关于 Map 的骚操作,在使用了这些功能后,不得不说一句真香。

先引入依赖坐标,然后开始我们的正式体验吧:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>30.1.1-jre</version>
</dependency>

Table:双键 Map

Java 中的 Map 只允许有一个 key 和一个 value 存在,但是 guava 中的 Table 允许一个 value 存在两个 key。

Table 中的两个 key 分别被称为 rowKey 和 columnKey,也就是行和列。(但是个人感觉将它们理解为行和列并不是很准确,看作两列的话可能会更加合适一些)

举一个简单的例子,假如要记录员工每个月工作的天数。用 Java 中普通的 Map 实现的话就需要两层嵌套:

Map<String,Map<String,Integer>> map=new HashMap<>();
//存放元素
Map<String,Integer> workMap=new HashMap<>();
workMap.put("Jan",20);
workMap.put("Feb",28);
map.put("Hydra",workMap);

//取出元素
Integer dayCount = map.get("Hydra").get("Jan");

如果使用 Table 的话就很简单了,看一看简化后的代码:

Table<String,String,Integer> table= HashBasedTable.create();
//存放元素
table.put("Hydra", "Jan", 20);
table.put("Hydra", "Feb", 28);

table.put("Trunks", "Jan", 28);
table.put("Trunks", "Feb", 16);

//取出元素
Integer dayCount = table.get("Hydra", "Feb");

我们不需要再构建复杂的双层 Map,直接一层搞定。除了元素的存取外,下面再看看其他的实用操作。

获得 key 或 value 的集合

代码如下:

//rowKey或columnKey的集合
Set<String> rowKeys = table.rowKeySet();
Set<String> columnKeys = table.columnKeySet();

//value集合
Collection<Integer> values = table.values();

分别打印它们的结果,key 的集合是不包含重复元素的,value 集合则包含了所有元素并没有去重:
[Hydra, Trunks]
[Jan, Feb]
[20, 28, 28, 16]

计算 key 对应的所有 value 的和

以统计所有 rowKey 对应的 value 之和为例:

for (String key : table.rowKeySet()) {
   
    Set<Map.Entry<String, Integer>> rows = table.row(key).entrySet();
    int total = 0;
    for (Map.Entry<String, Integer> row : rows) {
   
        total += row.getValue();
    }
    System.out.println(key + ": " + total);
}

打印结果:
Hydra: 48
Trunks: 44

转换 rowKey 和 columnKey

这一操作也可以理解为行和列的转置,直接调用 Tables 的静态方法 transpose:

Table<String, String, Integer> table2 = Tables.transpose(table);
Set<Table.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值