Guava是google公司开发的一款Java类库扩展工具包,内含了丰富的API,涵盖了集合、缓存、并发、I/O等多个方面。使用这些API一方面可以简化我们代码,使代码更为优雅,另一方面它补充了很多jdk中没有的功能,能让我们开发中更为高效。
今天Hydra要给大家分享的就是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,直接一层搞定。除了元素的存取外,下面再看看其他的实用操作。
1、获得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]
2、计算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
3、转换rowKey和columnKey
这一操作也可以理解为行和列的转置,直接调用Tables的静态方法transpose:
Table<String, String, Integer> table2