一、Joiner/Splitter
Joiner是连接器,Splitter是分割器,通常我们会把它们定义为static final,利用on生成对象后在应用到String进行处理,这是可以复用的。
对于Joiner,常用的方法是:
- 跳过NULL元素:skipNulls()
- 对于NULL元素使用其他替代:useForNull(String)
对于Splitter,常用的方法是:
- 分割结果进行trim()操作:trimResults()
- 分割结果去除无内容的字符串:omitEmptyStrings()
- 注意拆分的方式,有字符串,还有正则,还有固定长度分割(太贴心了!)
二、CharMatcher
CharMatcher,将字符的匹配和处理解耦,并提供丰富的方法供你使用!
对基本类型进行支持
guava对JDK提供的原生类型操作进行了扩展,使得功能更加强大!
三、Ints
guava提供了Bytes/Shorts/Ints/Iongs/Floats/Doubles/Chars/Booleans这些基本数据类型的扩展支持,只有你想不到的,没有它没有的!
对JDK集合的有效补充
四、Multiset
Multiset是什么,我想上面的图,你应该了解它的概念了。Multiset就是无序的,但是可以重复的集合,它就是游离在List/Set之间的“灰色地带”!
结果:
五、Immutable
在项目中,我们常常需要初始定义一些不可变的map或者list,jdk中有unmodifiable,但是该集合使用过程中会出现很多不便的地方,所以guava引入Immutable
六、BiMap
JDK提供的MAP让我们可以find value by key,那么能不能通过find key by value呢,能不能KEY和VALUE都是唯一的呢。这是一个双向的概念,即forward+backward。在实际场景中有这样的需求吗?比如通过用户ID找到mail,也需要通过mail找回用户名。没有guava的时候,我们需要create forward map AND create backward map,and now just let guava do that for you.
BiMap中的键值都是唯一的,也是唯一绑定的,所以结果是两个键值对被强制替换成了一个。
biMap / biMap.inverse() / biMap.inverse().inverse() 它们是什么关系呢?你可以稍微看一下BiMap的源码实现,实际上,当你创建BiMap的时候,在内部维护了2个map,一个forward map,一个backward map,并且设置了它们之间的关系。因此,biMap.inverse() != biMap ;biMap.inverse().inverse() == biMap
七、Tables
多个键对应着一个值
Table涉及到3个概念:rowKey,columnKey,value,并提供了多种视图以及操作方法让你更加轻松的处理多个KEY的场景。
记得我刚到成都找工作,当时面试者提出了想要用内存开发一套数据库,这个guava里面的tables简直完美满足了这个需求。
八、Functions、Predicate、filter
熟悉jdk 1.9 的同学看到这几个名词是不是感觉很熟悉,没错,jdk1.9已经这是将这个三个运用到了stream流矢编程中了。lamda表达式和函数式编程。。感觉怎么样?是不是很方便!
九、CacheLoader
jdk内存中生成一个类似redis的缓存。
首先,这是一个本地缓存,guava提供的cache是一个简洁、高效,易于维护的。为什么这么说呢?因为并没有一个单独的线程用于刷新 OR 清理cache,对于cache的操作,都是通过访问/读写带来的,也就是说在读写中完成缓存的刷新操作!其次,我们看到了,我们非常通俗的告诉cache,我们的缓存策略是什么,SO EASY!在如此简单的背后,是guava帮助我们做了很多事情,比如线程安全。
十、异步回调
JDK中提供了Future/FutureTask/Callable来对异步回调进行支持,但是还是看上去挺复杂的,能不能更加简单呢?比如注册一个监听回调。