阿里巴巴|为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程( 二 )




guava提供了Bytes/Shorts/Ints/Iongs/Floats/Doubles/Chars/Booleans这些基本数据类型的扩展支持 , 只有你想不到的 , 没有它没有的!
对 JDK 的有效补充
灰色地带:Multiset
JDK的集合 , 提供了有序且可以重复的List , 无序且不可以重复的Set 。 那这里其实对于集合涉及到了2个概念 , 一个order , 一个dups 。 那么List vs Set , and then some ?


Multiset
Multiset是什么 , 我想上面的图 , 你应该了解它的概念了 。 Multiset就是无序的 , 但是可以重复的集合 , 它就是游离在List/Set之间的“灰色地带”!(至于有序的 , 不允许重复的集合嘛 , guava还没有提供 , 当然在未来应该会提供UniqueList , 我猜的 , 哈哈)
来看一个Multiset的示例:
Multiset自带一个有用的功能 , 就是可以跟踪每个对象的数量 。
Immutable vs unmodifiable来我们先看一个unmodifiable的例子:


你看到JDK提供的unmodifiable的缺陷了吗?
实际上 , Collections.unmodifiableXxx所返回的集合和源集合是同一个对象 , 只不过可以对集合做出改变的API都被override , 会抛出UnsupportedOperationException 。
也即是说我们改变源集合 , 导致不可变视图(unmodifiable View)也会发生变化 , oh my god!
当然 , 在不使用guava的情况下 , 我们是怎么避免上面的问题的呢?


上面揭示了一个概念:Defensive Copies , 保护性拷贝 。
OK , unmodifiable看上去没有问题呢 , 但是guava依然觉得可以改进 , 于是提出了Immutable的概念 , 来看:
【阿里巴巴|为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程】

就一个copyOf , 你不会忘记 , 如此cheap
用Google官方的说法是:we're using just one classjust say exactly what we mean , 很了不起吗(不仅仅是个概念 , Immutable在COPY阶段还考虑了线程的并发性等 , 很智能的!)
guava提供了很多Immutable集合 , 比如ImmutableList/ImmutableSet/ImmutableSortedSet/ImmutableMap/......
看一个ImmutableMap的例子:


可不可以一对多:Multimap

JDK提供给我们的Map是一个键 , 一个值 , 一对一的 , 那么在实际开发中 , 显然存在一个KEY多个VALUE的情况(比如一个分类下的书本) , 我们往往这样表达:Map<kList<v>> , 好像有点臃肿!臃肿也就算了 , 更加不爽的事 , 我们还得判断KEY是否存在来决定是否new 一个LIST出来 , 有点麻烦!更加麻烦的事情还在后头 , 比如遍历 , 比如删除 , so hard......
来看guava如何替你解决这个大麻烦的:


友情提示下 , guava所有的集合都有create方法 , 这样的好处在于简单 , 而且我们不必在重复泛型信息了 。
get()/keys()/keySet()/values()/entries()/asMap()都是非常有用的返回view collection的方法 。
Multimap的实现类有:ArrayListMultimap/HashMultimap/LinkedHashMultimap/TreeMultimap/ImmutableMultimap/......
可不可以双向:BiMapJDK提供的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.


推荐阅读