前沿追踪|Java 程序员使用 Google Guava 编程?,为什么推荐

前言
目前GoogleGuava在实际应用中非常广泛 , 本篇博客将以博主对Guava使用的认识以及在项目中的经验来给大家分享!学习使用GoogleGuava可以让你快乐编程 , 写出优雅的Java代码 , 在业务允许的条件下 , 我推荐使用Guava编程!
Joiner/Splitter/CharMatcher
JDK提供的String还不够好么?
也许还不够友好 , 至少让我们用起来还不够爽 , 还得操心!
举个栗子 , 比如String提供的split方法 , 我们得关心空字符串吧 , 还得考虑返回的结果中存在null元素吧 , 只提供了前后trim的方法(如果我想对中间元素进行trim呢) 。
那么 , 看下面的代码示例 , guava让你不必在操心这些:
发现没有我们想对String做什么操作 , 就是生成自己定制化的Joiner/Splitter , 多么直白 , 简单 , 流畅的API!
对于Joiner , 常用的方法是跳过NULL元素:skipNulls()/对于NULL元素使用其他替代:useForNull(String)
对于Splitter , 常用的方法是:trimResults()/omitEmptyStrings() 。 注意拆分的方式 , 有字符串 , 还有正则 , 还有固定长度分割(太贴心了!)
其实除了Joiner/Splitter外 , guava还提供了字符串匹配器:CharMatcher
对基本类型的支持
guava对JDK提供的原生类型操作进行了扩展 , 使得功能更加强大
对JDK的有效补充
灰色地带:Multiset
JDK的集合 , 提供了有序且可以重复的List , 无序且不可以重复的Set 。 那这里其实对于集合涉及到了2个概念 , 一个order , 一个dups 。 那么ListvsSet , andthensome?
Multiset是什么 , 我想上面的图 , 你应该了解它的概念了 。 Multiset就是无序的 , 但是可以重复的集合 , 它就是游离在List/Set之间的“灰色地带”!(至于有序的 , 不允许重复的集合嘛 , guava还没有提供 , 当然在未来应该会提供UniqueList , 我猜的 , 哈哈)
来看一个Multiset的示例:
Immutablevsunmodifiable
来我们先看一个unmodifiable的例子:
实际上 , Collections.unmodifiableXxx所返回的集合和源集合是同一个对象 , 只不过可以对集合做出改变的API都被override , 会抛出UnsupportedOperationException 。
也即是说我们改变源集合 , 导致不可变视图(unmodifiableView)也会发生变化 , ohmygod!
当然 , 在不使用guava的情况下 , 我们是怎么避免上面的问题的呢?
OK , unmodifiable看上去没有问题呢 , 但是guava依然觉得可以改进 , 于是提出了Immutable的概念 , 来看:
用Google官方的说法是:we'reusingjustoneclass,justsayexactlywhatwemean , 很了不起吗(不仅仅是个概念 , Immutable在COPY阶段还考虑了线程的并发性等 , 很智能的!)
guava提供了很多Immutable集合 , 比如ImmutableList/ImmutableSet/ImmutableSortedSet/ImmutableMap/......
看一个ImmutableMap的例子:
JDK提供给我们的Map是一个键 , 一个值 , 一对一的 , 那么在实际开发中 , 显然存在一个KEY多个VALUE的情况(比如一个分类下的书本) , 我们往往这样表达:Map> , 好像有点臃肿!臃肿也就算了 , 更加不爽的事 , 我们还得判断KEY是否存在来决定是否new一个LIST出来 , 有点麻烦!更加麻烦的事情还在后头 , 比如遍历 , 比如删除 , sohard......
来看guava如何替你解决这个大麻烦的:
get()/keys()/keySet()/values()/entries()/asMap()都是非常有用的返回viewcollection的方法 。
Multimap的实现类有:ArrayListMultimap/HashMultimap/LinkedHashMultimap/TreeMultimap/ImmutableMultimap/......
可不可以双向:BiMap
JDK提供的MAP让我们可以findvaluebykey , 那么能不能通过findkeybyvalue呢 , 能不能KEY和VALUE都是唯一的呢 。 这是一个双向的概念 , 即forward+backward 。
在实际场景中有这样的需求吗?比如通过用户ID找到mail , 也需要通过mail找回用户名 。 没有guava的时候 , 我们需要createforwardmapANDcreatebackwardmap , andnowjustletguavadothatforyou.
你可以稍微看一下BiMap的源码实现 , 实际上 , 当你创建BiMap的时候 , 在内部维护了2个map , 一个forwardmap , 一个backwardmap , 并且设置了它们之间的关系 。
因此 , biMap.inverse()!=biMap;biMap.inverse().inverse()==biMap
可不可以多个KEY:Table
我们知道数据库除了主键外 , 还提供了复合索引 , 而且实际中这样的多级关系查找也是比较多的 , 当然我们可以利用嵌套的Map来实现:Map> 。 为了让我们的代码看起来不那么丑陋 , guava为我们提供了Table 。