写点什么

为什么我不建议你用阿里巴巴 Java 规范,而使用 Google Guava 编程?

用户头像
极客good
关注
发布于: 刚刚


CharMatcher,将字符的匹配和处理解耦,并提供丰富的方法供你使用!




对基本类型的支持


guava 对 JDK 提供的原生类型操作进行了扩展,使得功能更加强大



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 的概念,来看:



就一个 copyOf,你不会忘记,如此 cheap


用 Google 官方的说法是:we're using just one class,just say exactly what we mean,很了不起吗(不仅仅是个概念,Immutable 在 COPY 阶段还考虑了线程的并发性等,很智能的!)


guava 提供了很多 Immutable 集合,比如 ImmutableList/ImmutableSet/ImmutableSortedSet/ImmutableMap/......


看一个 ImmutableMap 的例子:



可不可以一对多:Multimap


JDK 提供给我们的 Map 是一个键,一个值,一对一的,那么在实际开发中,显然存在一个 KEY 多个 VALUE 的情况(比如一个分类下的书本),我们往往这样表达:Map<k,Lis


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


t<v>>,好像有点臃肿!臃肿也就算了,更加不爽的事,我们还得判断 KEY 是否存在来决定是否 new 一个 LIST 出来,有点麻烦!更加麻烦的事情还在后头,比如遍历,比如删除,so hard......


来看 guava 如何替你解决这个大麻烦的:



友情提示下,guava 所有的集合都有 create 方法,这样的好处在于简单,而且我们不必在重复泛型信息了。


get()/keys()/keySet()/values()/entries()/asMap()都是非常有用的返回 view collection 的方法。


Multimap 的实现类有:ArrayListMultimap/HashMultimap/LinkedHashMultimap/TreeMultimap/ImmutableMultimap/......


**可不可以双向:**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.inverse() / biMap.inverse().inverse() 它们是什么关系呢?


你可以稍微看一下 BiMap 的源码实现,实际上,当你创建 BiMap 的时候,在内部维护了 2 个 map,一个 forward map,一个 backward map,并且设置了它们之间的关系。


因此,biMap.inverse() ?!= biMap ;biMap.inverse().inverse() == biMap


**可不可以多个 KEY:**Table




我们知道数据库除了主键外,还提供了复合索引,而且实际中这样的多级关系查找也是比较多的,当然我们可以利用嵌套的 Map 来实现:Map<k1,Map<k2,v2>>。为了让我们的代码看起来不那么丑陋,guava 为我们提供了 Table。



Table 涉及到 3 个概念:rowKey,columnKey,value,并提供了多种视图以及操作方法让你更加轻松的处理多个 KEY 的场景。


函数式编程:Funcitons



用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
为什么我不建议你用阿里巴巴Java规范,而使用 Google Guava 编程?