Guava中独特的Map操作
前言
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.