类库(Guava)
概述
Guava包含了若干被Google的 Java项目广泛依赖的核心库,是能够提供java api的增强与扩展能力的类库,提供用于集合,缓存,支持原语,并发性,常见注解,字符串处理,I/O和验证的实用方法。
适用范围
Pangea v2.0.1.3+
快速上手
在业务模块的pom
文件中添加依赖:
html
<!--guava依赖-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
注意
目前框架支持版本为26.0-jre,使用框架的工程不需要额外引用依赖。
常用方法
集合
html
// 普通Collection的创建
List<String> list = Lists.newArrayList();
Set<String> set = Sets.newHashSet();
Map<String, String> map = Maps.newHashMap();
// 不可变Collection的创建
ImmutableList<String> iList = ImmutableList.of("a", "b", "c");
ImmutableSet<String> iSet = ImmutableSet.of("e1", "e2");
ImmutableMap<String, String> iMap = ImmutableMap.of("k1", "v1", "k2", "v2");
注意
不可变对象中,操作对象的方法都已经被声明为过期,并且抛出异常。不需要单独声明。
特殊集合类型
html
MultiSet: 无序+可重复 count()方法获取单词的次数 增强了可读性+操作简单
创建方式: Multiset<String> set = HashMultiset.create();
Multimap: key-value key可以重复,对应的value自动转换为list
创建方式: Multimap<String, String> teachers = ArrayListMultimap.create();
BiMap: 双向Map(Bidirectional Map) 键与值都不能重复
创建方式: BiMap<String, String> biMap = HashBiMap.create();
Table: 双键的Map Map--> Table-->rowKey+columnKey+value //和sql中的联合主键有点像
创建方式: Table<String, String, Integer> tables = HashBasedTable.create();
...等等(guava中还有很多java里面没有给出的集合类型)
集合过滤
html
//按照条件过滤
ImmutableList<String> names = ImmutableList.of("begin", "code", "Guava", "Java");
Iterable<String> fitered = Iterables.filter(names, Predicates.or(Predicates.equalTo("Guava"), Predicates.equalTo("Java")));
System.out.println(fitered); // [Guava, Java]
//自定义过滤条件 使用自定义回调方法对Map的每个Value进行操作
ImmutableMap<String, Integer> m = ImmutableMap.of("begin", 12, "code", 15);
// Function<F, T> F表示apply()方法input的类型,T表示apply()方法返回类型
Map<String, Integer> m2 = Maps.transformValues(m, new Function<Integer, Integer>() {
public Integer apply(Integer input) {
if(input>12){
return input;
}else{
return input+1;
}
}
});
System.out.println(m2); //{begin=13, code=15}
交集、并集和差集
此外,Guava还提供了Set和Map计算交集、并集和差集的方法。
字符串
Join连接器
用于将集合转为特定规则的字符串
html
List<String> lists = Lists.newArrayList("a","b","g","8","9");
String result = Joiner.on(",").join(lists);
System.out.println(result);
结果:a,b,g,8,9
html
// joiner withKeyValueSeparator(String value) map连接器,keyValueSeparator为key和value之间的分隔符
Map<String, Integer> map = Maps.newHashMap();
map.put("xiaoming", 12);
map.put("xiaohong",13);
String result = Joiner.on(",").withKeyValueSeparator("=").join(map);
结果: xiaoming=12,xiaohong=13
html
//joiner skipNulls()连接跳过null元素
List<String> lists = Lists.newArrayList("a","b,"g",null,"8","9");
String result = Joiner.on(",").skipNulls().join(lists);
System.out.println(result);
结果:a,b,g,8,9
html
// joiner useForNull(final String value)用value替换null元素值
List<String> lists = Lists.newArrayList("a", "b", "g", null, "8", "9");
String result = Joiner.on(",").useForNull("哈哈").join(lists);
System.out.println(result);
结果:a,b,g,哈哈,8,9
Splitter拆分器
用于将字符串拆分成指定的集合
html
//
String test = "34344,34,34,哈哈";
List<String> lists = Splitter.on(",").splitToList(test);
System.out.println(lists);
结果:[34344, 34, 34, 哈哈]
html
//splitter trimResults 拆分去除前后空格
String test = " 34344,34,34,哈哈 ";
List<String> lists = Splitter.on(",").trimResults().splitToList(test);
System.out.println(lists);
结果:[34344, 34, 34, 哈哈]
html
//splitter omitEmptyStrings 去除拆分出来空的字符串
String test = " 3434,434,34,,哈哈 ";
List<String> lists = Splitter.on(",").omitEmptyStrings().splitToList(test);
System.out.println(lists);
结果:[ 3434, 434, 34, 哈哈 ]
html
//splitter fixedLength(int lenght) 把字符串按固定长度分割
String test = "343443434哈哈";
List<String> lists = Splitter.fixedLength(3).splitToList(test);
System.out.println(lists);
结果:[343, 443, 434, 哈哈]
MoreObjects
不用大量的重写 toString,用一种很优雅的方式实现重写,或者在某个场景定制使用。
html
Person person = new Person("aa",11);
String str = MoreObjects.toStringHelper("Person").add("age", person.getAge()).toString();
System.out.println(str);
//输出Person{age=11}
计算中间代码的运行时间
html
Stopwatch stopwatch = Stopwatch.createStarted();
for(int i=0; i<100000; i++){
// do some thing
}
long nanos = stopwatch.elapsed(TimeUnit.MILLISECONDS);
System.out.println(nanos);