Guava常用的集合扩展
做过Java开发的码农,应该对Guava库非常熟悉。Guava是由谷歌开源的Java库,Guava库日益强大,涉及到Java开发的方方面面,用以帮助Java码农更高效的开发。
此篇来介绍下Guava包中常用的几种对Java集合的扩展。
Immutable 系列
该系列的集合代表不可变的集合,不可修改,可以用来保存一些常量映射的键值对;但是我更喜欢的是它便于创建的特点,如下:
@Test
public void test6() {
// ImmutableMap 通过of方法可直接创建map
// 创建时最多可以初始化5对 key-value
Map<String, Object> of = ImmutableMap.of(
"A", "a",
"B", "b",
"C", "c",
"D", "d",
"E", "e"
);
// 要初始化更多key-value可以通过其 builder 模式
Map<String, Object> build = ImmutableMap.<String, Object>builder()
.put("A", "a")
// ...
.build();
// 创建并初始化List
List<String> list = ImmutableList.of("a", "b");
}
方法很多,使用也较简单
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

浙公网安备 33010602011771号