Skip to content

类库(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);

参考文档

  1. Guava API 文档
  2. Google Guava官方教程(中文版)
  3. Google guava工具类的介绍和使用
  4. Guava入门