这一节介绍guava中集合类的使用。
文档官网地址:https://github.com/google/guava/wiki
guava最新的jar包版本为27.1-jre。使用中可添加maven依赖:
com.google.guava
guava
27.1-jre
可变列表工具类,方法newArrayList()可以快速创建列表,如
List<String> list = Lists.newArrayList("one", "two", "three", "one", "three");
不可变列表,使用其方法of()可以快速创建列表,方法copyOf()复制列表, 如:
//快速创建不可变的list
List<String> list = ImmutableList.of("one", "two", "three", "one", "three");
//复制列表
list = ImmutableList.copyOf(list);
可变集合工具类,如方法newHashSet()可快速创建集合,使用如:
Set<String> set = Sets.newHashSet("one", "two", "three", "one", "three");
不可变集合,使用其方法of()可以快速创建列表,方法copyOf()复制列表, 如:
//快速创建不可变的set
Set<String> set = ImmutableSet.of("one", "two", "three", "one");
//复制集合
set = ImmutableSet.copyOf(set);
Multiset(工具类为Multisets)为接口,界于jdk中List和Set之间的特性,用于创建可重复无序的集合。
常用实现有:
HashMultiset:重复无序的集合;
TreeMultiset:重复排序的集合;
另外还有其它实现,可查看源码。
使用示例如下:
//创建重复无顺multiset
Multiset<String> multiset = HashMultiset.create();
//添加元素
multiset.add("one");
multiset.add("two");
multiset.add("one");
//查看元素个数
multiset.count("one");
//返回原始set
Set<String> rawSet = multiset.elementSet();
map的工具类,如方法newHashMap()可创建map,使用如:
Map<String, String> map = Maps.newHashMap(ImmutableMap.of("one", "1", "two", "2"));
不可变映射, 方法of()可快速创建映射,如:
//快速创建不可变的map
Map<String, String> map = ImmutableMap.of("one", "1", "two", "2");
BiMap为接口,key和value可相互映射,方法inverse()为key和value互换,使用示例如:
//双向映射
BiMap<String, String> biMap = ImmutableBiMap.copyOf(map);
//key和value互换位置
biMap = biMap.inverse();
//创建双向可变map
biMap = HashBiMap.create(map);
biMap.put("one", "1");
Multimap(工具类为Multimaps)与Multiset类似,为接口,相同key可以有多个value,常用使用有:
HashMultimap:key-value键值对不可重复;
LinkedHashMultimap: key-value键值对不可重复,且value顺序为添加顺序;
TreeMultimap:key-value键值对不可重复,key和value按会自然或指定排序;
ArrayListMultimap:key-value键值对可重复,使用ArrayList存储value, value顺序为添加的顺序,相同key中的value有序可重复;
LinkedListMultimap:key-value键值对可重复,key和value均有序;
使用示例如下:
//创建HashMultimap,其中key-value值无序且不可重复
Multimap<String, String> hashMultimap = HashMultimap.create();
hashMultimap.put("tow", "2");
hashMultimap.put("one", "first");
hashMultimap.put("one", "1");
hashMultimap.put("one", "first");
//转为常规map
Map<String, Collection<String>> listMap = hashMultimap.asMap();
//获取指定key的value List
List<String> list1 = (List<String>) listMap.get("one");
Table(工具类Tables)为接口,可从row和column两个方向进行二维索引(区别于Map为一维索引)。常用实现有:
HashBasedTable:key无序;
TreeBasedTable:key会重排序;
使用示例如下:
//类似于HashMap>,创建HashBasedTable
Table<String, String, String> table = HashBasedTable.create();
//添加rowKey,colKey和value
table.put("oneRow", "oneCol", "oneVal1");
table.put("oneRow", "twoCol", "oneVal2");
table.put("twoRow", "twoCol", "oneVal2");
//获取指定rowKey,colKey的value
String val = table.get("oneRow", "oneCol");
//获取指定rowKey的map
Map<String, String> rowMap = table.row("oneRow");
//获取指定colKey的map
Map<String, String> colMap = table.column("oneRow");
//转为row方向的map
Map<String, Map<String, String>> rowMMap = table.rowMap();
//转为col方向的map
Map<String, Map<String, String>> colMMap = table.columnMap();
//获取rowKey集合
Set<String> rowSet = table.rowKeySet();
//获取colKey集合
Set<String> colSet = table.columnKeySet();
Class对象到实例的映射,在一个map中存多种类型实例,使用示例如下:
@Data
static class Stu{
private String stuName;
public Stu(String stuName) {
this.stuName = stuName;
}
}
@Data
static class School{
private String schoolName;
public School(String schoolName) {
this.schoolName = schoolName;
}
}
public static void main(String[] args) {
ClassToInstanceMap clazzMap = MutableClassToInstanceMap.create();
clazzMap.put(Stu.class, new Stu("apple"));
clazzMap.put(School.class, new School("banana"));
Stu stu = (Stu) clazzMap.get(Stu.class);
School school = (School) clazzMap.get(School.class);
}
上面仅列出来guava中的部分集合操作,更多的可查看源码。