做过Java
开发的码农,应该对Guava
库非常熟悉。Guava
是由谷歌开源的Java
库,Guava
库日益强大,涉及到Java
开发的方方面面,用以帮助Java
码农更高效的开发。
此篇来介绍下Guava
包中常用的几种对Java
集合的扩展。
Multimap
这是对Map的扩展,Map是一对一的映射,一键对一值,那当我们想一键对应多个值时怎么办?
由于Map的值是Object
类型,所以我们肯定写过Map<String, List<Map<String, Object>>
这种结构,这确实可以达到目的。
但是这种结构写起来很繁杂,大家应该有所感触。
此处仅以HashMultimap
实现类当做示例:
public void test1() {
Multimap<String, String> map = HashMultimap.create();
map.put("language", "Java");
map.put("language", "php");
map.put("language", "python");
map.put("language", "c++");
log.info("编程语言: {}", map.get("language"));
}
输出:
guava.MultiMapTest - 编程语言: [Java, php, python, c++]
返回的是一个集合;该map的其他方法都见名知意,易于使用。
BiMap
通常使用Map结构都是通过键查找对应的值,对于要通过值查找键就必须循环比较了;
BiMap
此类型就提供了key
和value
的双向映射,便于通过value
查找key
,要注意的是BiMap
结构要求key
和value
都是唯一的。
此处仅以HashBiMap
实现类作为示例:
public void test2() {
BiMap<String, String> biMap = HashBiMap.create();
biMap.put("language", "Java");
// 同key时, value会覆盖之前的
biMap.put("language", "php");
// 同value时, key强制覆盖之前的
biMap.forcePut("test", "Java");
System.out.println("原始BiMap -- " + biMap);
BiMap<String, String> inverse = biMap.inverse();
System.out.println("inverse翻转之后 -- " + inverse);
}
输出:
原始BiMap -- {language=php, test=Java}
inverse翻转之后 -- {php=language, Java=test}
Table
Map提供了一对一的映射,Table则提供二对一的映射
此处仅以HashBasedTable
实现类为示例:
public void test3() {
Table<String, String, Object> table = HashBasedTable.create();
table.put("row1", "column1", "value1");
table.put("row1", "column2", "value2");
table.put("row1", "column3", "value3");
Map<String, Object> row1 = table.row("row1");
System.out.println("根据rowKey取值 -- " + row1);
Map<String, Object> column1 = table.column("column1");
System.out.println("根据columnKey取值 -- " + column1);
}
输出:
根据rowKey取值 -- {column1=value1, column2=value2, column3=value3}
根据columnKey取值 -- {row1=value1}
Multiset
multiset
可获取某个元素的个数
public void test5() {
Multiset<String> multiset = HashMultiset.create();
multiset.add("a");
multiset.add("b");
multiset.add("a");
System.out.println("multiset集合 -- " + multiset);
System.out.println("multiset大小 -- " + multiset.size());
System.out.println("a个数 -- " + multiset.count("a"));
System.out.println("b个数 -- " + multiset.count("b"));
}
输出:
multiset集合 -- [a x 2, b]
multiset大小 -- 3
a个数 -- 2
b个数 -- 1