Guava 官方文档:https://github.com/google/guava/wiki
Guava 中文文档:https://wizardforcel.gitbooks.io/guava-tutorial/content/index.html
Google Guava 快速入门

这里只是介绍一下 Guava 的一些常用功能,相当于一个概览,具体的使用参考上面的三篇文档,里面有详细的使用例子。

关于 Guava 在实际使用过程中,有哪些奇技淫巧,待日后在实际工作中发现了,再做进一步的分析整理,或者哪位网友在平时的开发中使用了 Guava 的一些功能,也可以教教我,在评论区留言,大家共同进步。

排序器(Ordering)

关于 Guava 排序器(Ordering)推荐如下文章:

排序器(Ordering)提供了如下特性帮助简化代码逻辑:

  • 提供了链式调用的方式
  • 提供了一些非常实用的方法,比如 explicit(List<T> valuesInOrder) 可以实现按照 valuesInOrder 中的顺序对列表进行排序。

集合(Collections)

不可变集合(Immutable collections)

区别于 JDK 中提供的 Collections.unmodifiableXXX 方法,Guava 提供的是独立的集合类。

可变集合接口 JDK or Guava 提供 不可变版本
Collection JDK ImmutableCollection
List JDK ImmutableList
Set JDK ImmutableSet
SortedSet/NavigableSet JDK ImmutableSortedSet
Map JDK ImmutableMap
SortedMap JDK ImmutableSortedMap
Multiset Guava ImmutableMultiset
SortedMultiset Guava ImmutableSortedMultiset
Multimap Guava ImmutableMultimap
ListMultimap Guava ImmutableListMultimap
SetMultimap Guava ImmutableSetMultimap
BiMap Guava ImmutableBiMap
ClassToInstanceMap Guava ImmutableClassToInstanceMap
Table Guava ImmutableTable

新集合类型(New collection types)

Guava 引入了很多 JDK 中没有的,但发现明显有用的新的集合类型。这些新的集合类型是对 JDK 中原有集合类型的补充,两者是共存的。

新集合类型 描述
Multiset
- 支持添加相等的元素。
- Multiset 可以用来统计给定元素在 Multiset 中的计数。
SortedMultiset 是 Multiset 接口的变种,它支持高效地获取指定范围的子集。
Multimap 可以很容易地把一个键映射到多个值,比 JDK 中提供的 Map> 或 Map> 的实现方式更加轻巧。
BiMap
- 保证值是唯一的,因此 values() 返回 Set 而不是普通的 Collection。
- 可以用 inverse() 反转 BiMap 的键值映射。
Table 可以使用多个键做索引,比如使用 Table 来代替 JDK 中 Map> 的实现方式。
ClassToInstanceMap 它的键是类型,而值是符合键所指类型的对象,类似 JDK 中 Map, B> 的实现方式。
RangeSet 描述了一组不相连的、非空的区间。当把一个区间添加到可变的 RangeSet 时,所有相连的区间会被合并,空区间会被忽略。
RangeMap 描述了“不相交的、非空的区间”到特定值的映射。和 RangeSet 不同,RangeMap 不会合并相邻的映射,即便相邻的区间映射到相同的值。

RangeSet 和 RangeMap 相对比较难理解,它们两个都是用来处理区间范围的,具体使用需要参考 Guava 官方文档,避免使用上出现偏差。

集合工具类(Utility Classes)

Guava 提供了更多的工具类,极大的扩展了 JDK 的 java.util.Collections 类,这是 Guava 最流行和成熟的部分之一。

我们用相对直观的方式把工具类与特定集合接口的对应关系归纳如下:

集合接口 JDK or Guava 提供 对应的 Guava 工具类
Collection JDK Collections2
List JDK Lists
Set JDK Sets
SortedSet JDK Sets
Map JDK Maps
SortedMap JDK Maps
Queue JDK Queues
Multiset Guava Multisets
Multimap Guava Multimaps
BiMap Guava Maps
Table Guava Tables

Collections2 是 Guava 提供的 Collection 的工具类,不要和 JDK 的 java.util.Collections 类混淆。

集合扩展工具类(Extension Utilities)

Guava 提供了几个工具类实现对集合功能的扩展,比如你想在元素被添加到列表时增加特定的行为,或者实现一个自定义 Iterable 跳过空值。

缓存(Caches)

推荐文章:Guava cache 使用总结

Guava Cache 是单个应用运行时的本地缓存,不支持跨 Java 进程的情况。提供了如下特性:

  • 封装了 get、put 操作,支持缓存的存取操作。
  • 通过 CacheLoader 和 Callable 类实现了自动加载功能,参考推荐文章,里面有详细的案例。
  • 提供了三种缓存回收功能:基于容量的回收、定时回收、基于引用的回收。
  • 提供了缓存刷新、统计、asMap 视图的功能。

字符串工具(Strings)

Guava 提供了五种工具类 Joiner(连接器)、Splitter(拆分器)、CharMatcher(字符匹配器)、Charsets(字符集)、CaseFormat(大小写格式),帮助我们灵活的处理字符串。

散列(Hashing)

Object.hashCode 在预防碰撞上很弱,往往需要通过再次 Hash 才能达到散列的要求,Guava Hashing 加强了 JDK 的散列算法,同时提供了一系列散列函数,另外它还提供了布鲁姆过滤器(BloomFilter)。

反射(Reflection)

Guava 的反射提供了如下功能:

  • TypeToken:用来解决 Java 运行时泛型类型被擦除的问题,可以获取泛型类型,比如获取到 ArrayList 里面的 Class java.lang.String。
  • Invokable:它通过对 java.lang.reflect.Method 和 java.lang.reflect.Constructor 的流式包装来简化 Java 反射代码的使用。
  • Dynamic Proxies:提供简便的动态代理实现。
  • ClassPath:是对 Java ClassPath 功能的强化,提供扫描非 URLClassLoader 的自定义 Class Loader 管理的 Class(有时间了解一下 Java 的类加载机制)。

作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/iwiqy2 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。