Hello ! 我是小小,今天是本周的第四篇,本篇将会着重的让小小介绍一下对30岁Java程序猿的忠告,强烈推荐哦~

前言

Java程序猿都干到30了,还不会Google Guava,你out啦,快来跟着本文愉快的学习一下Goog Guava,快乐编程,快乐你我~

以面向对象思想处理字符串

JDK提供的String不好吗?也许不好不爽,那就行,让30岁的程序猿们愉快的使用guava进行操作。
看看如下代码:
忠告 | 小小对Java30岁程序猿的忠告,强烈推荐!插图
其中Joiner是连接器,Splitter是分割器,通常我们会吧他们定义为static final,利用on生成对象后应用到String进行处理,这是可以复用的。要知道apache commons StringUtils提供都是static method,更加重要的是,guava提供的joiner/splitter是经过充分测试的,他的稳定性和效率要比apache高出不少,这个可以测试一下哦~
发现没有我们想对String做什么操作,就是生成自己定制的Joiner/Splitter这是多么直接接的操作。
对于Joiner,常用的方法跳过null元素,skipNulls()对于NULL元素使用其他替代,useForNull(String)
对于Splitter,常用的方法有,trimResults()/omitEmptyStrings()。注意拆分方式,有字符串哦!
其实除了Joiner/Splitter以外,guava还提供了字符串匹配器。CharMatcher
忠告 | 小小对Java30岁程序猿的忠告,强烈推荐!插图1
CharMatcher,将字符的匹配和处理解耦,并提供丰富的方法供你使用!

对基本类型进行支持

忠告 | 小小对Java30岁程序猿的忠告,强烈推荐!插图2
guava提供了Bytes/Shorts/Ints/Iongs/Floats/Doubles/Chars/Booleans这些基本数据类型的扩展支持,只有你想不到的,没有它没有的!

对JDK集合的有效补充

灰色地带 Multiset

JDK的集合,提供了有序且可以重复的List,无序且不可以重复的set,那这里其实对于集合涉及到了两个概念,一个order,一个dups,那么List Vs Set,and then some?
忠告 | 小小对Java30岁程序猿的忠告,强烈推荐!插图3
举个例子
忠告 | 小小对Java30岁程序猿的忠告,强烈推荐!插图4
Multiset自带一个有用的功能,可以跟踪每个对象的数量。

Immutable vs unmodifiable

来先看一个例子:
忠告 | 小小对Java30岁程序猿的忠告,强烈推荐!插图5

你看到JDK提供的unmodifiable的缺陷了吗?

实际上,Collections.unmodifiableXxx所返回的集合和源集合是同一个对象,只不过可以对集合做出改变的API都被override,会抛出UnsupportedOperationException。

也即是说我们改变源集合,导致不可变视图(unmodifiable View)也会发生变化,oh my god!

如何解决问题呢?
例子在这~
忠告 | 小小对Java30岁程序猿的忠告,强烈推荐!插图6
OK,unmodifiable看上去没有问题呢,但是guava依然觉得可以改进,于是提出了Immutable的概念,来看:

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

看一个ImmutableMap的例子:

忠告 | 小小对Java30岁程序猿的忠告,强烈推荐!插图7

可不可以一对多:Multimap

JDK提供的MAP是一对一的,可不可以一对多呢?这样来看。
guava是如何解决的
忠告 | 小小对Java30岁程序猿的忠告,强烈推荐!插图8

可不可以双向:BiMap

忠告 | 小小对Java30岁程序猿的忠告,强烈推荐!插图9

可不可以多个KEY:Table

忠告 | 小小对Java30岁程序猿的忠告,强烈推荐!插图10

函数式编程:Functions

忠告 | 小小对Java30岁程序猿的忠告,强烈推荐!插图11

断言:Predicate

忠告 | 小小对Java30岁程序猿的忠告,强烈推荐!插图12

如何处理null?

忠告 | 小小对Java30岁程序猿的忠告,强烈推荐!插图13
快速失败~

如何处理缓存~

忠告 | 小小对Java30岁程序猿的忠告,强烈推荐!插图14
首先,这是一个本地缓存,guava提供的cache是一个简洁、高效,易于维护的。为什么这么说呢?因为并没有一个单独的线程用于刷新 OR 清理cache,对于cache的操作,都是通过访问/读写带来的,也就是说在读写中完成缓存的刷新操作!

异步回调相当的简单

忠告 | 小小对Java30岁程序猿的忠告,强烈推荐!插图15

更多

忠告 | 小小对Java30岁程序猿的忠告,强烈推荐!插图16

关于作者

我是小小。双鱼座的程序猿哦~我们下期再见~bye~