Java|Guava中这些Map的优秀操作,让我的代码量减少了50%

Java|Guava中这些Map的优秀操作,让我的代码量减少了50%

文章图片

Java|Guava中这些Map的优秀操作,让我的代码量减少了50%


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 - 双键Mapjava中的Map只允许有一个key和一个value存在 , 但是guava中的Table允许一个value存在两个key 。 Table中的两个key分别被称为rowKey和columnKey , 也就是行和列 。 (但是个人感觉将它们理解为行和列并不是很准确 , 看作两列的话可能会更加合适一些) 。
举一个简单的例子 , 假如要记录员工每个月工作的天数 。 用java中普通的Map实现的话就需要两层嵌套:
Map<StringMap<StringInteger>> map=new HashMap<>();//存放元素Map<StringInteger> workMap=new HashMap<>();
workMap.put(\"Jan\"20);
workMap.put(\"Feb\"28);
map.put(\"Hydra\"workMap);//取出元素Integer dayCount = map.get(\"Hydra\").get(\"Jan\");

如果使用Table的话就很简单了 , 看一看简化后的代码:
Table<StringStringInteger> 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: 48Trunks: 44

3、转换rowKey和columnKey这一操作也可以理解为行和列的转置 , 直接调用Tables的静态方法transpose:
Table<String String Integer> table2 = Tables.transpose(table);Set<Table.Cell<String String Integer>> cells = table2.cellSet();
cells.forEach(cell->
   System.out.println(cell.getRowKey()+\"\"+cell.getColumnKey()+\":\"+cell.getValue())
);

利用cellSet方法可以得到所有的数据行 , 打印结果 , 可以看到row和column发生了互换:
JanHydra:20FebHydra:28JanTrunks:28FebTrunks:16

4、转为嵌套的Map还记得我们在没有使用Table前存储数据的格式吗 , 如果想要将数据还原成嵌套Map的那种形式 , 使用Table的rowMap或columnMap方法就可以实现了: