您当前的位置: 首页 >  Java

暂无认证

  • 0浏览

    0关注

    92582博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

为什么强烈推荐 Java 程序员使用 Google Guava 编程

发布时间:2020-05-11 21:28:29 ,浏览量:0

前言

阿里巴巴出了一本Java规范,在国内java开发眼里被赋予了神圣的殿堂,我不推荐你用阿里巴巴的开发手册。

目前Google Guava在实际应用中非常广泛,本篇博客将以博主对 Guava 使用的认识以及在项目中的经验来给大家分享!学习使用 Google Guava可以让你快乐编程,写出优雅的 Java 代码,在业务允许的条件下,我推荐使用 Guava编程!Google 出品 Java 编码规范,科学又权威,强烈推荐!

Joiner/Splitter/CharMatcher

JDK提供的String还不够好么?

也许还不够友好,至少让我们用起来还不够爽,还得操心!

举个栗子,比如String提供的split方法,我们得关心空字符串吧,还得考虑返回的结果中存在null元素吧,只提供了前后trim的方法(如果我想对中间元素进行trim呢)。

那么,看下面的代码示例,guava让你不必在操心这些: 在这里插入图片描述

Joiner是连接器,Splitter是分割器,通常我们会把它们定义为static final,利用on生成对象后在应用到String进行处理,这是可以复用的。要知道apache commons StringUtils提供的都是static method。更加重要的是,guava提供的Joiner/Splitter是经过充分测试,它的稳定性和效率要比apache高出不少,这个你可以自行测试下。

发现没有我们想对String做什么操作,就是生成自己定制化的Joiner/Splitter,多么直白,简单,流畅的API!

对于Joiner,常用的方法是 跳过NULL元素:skipNulls() / 对于NULL元素使用其他替代:useForNull(String)

对于Splitter,常用的方法是:trimResults()/omitEmptyStrings()。注意拆分的方式,有字符串,还有正则,还有固定长度分割(太贴心了!)

其实除了Joiner/Splitter外,guava还提供了字符串匹配器:CharMatcher 在这里插入图片描述 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,好像有点臃肿!臃肿也就算了,更加不爽的事,我们还得判断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

关注
打赏
1653961664
查看更多评论
立即登录/注册

微信扫码登录

1.7487s