目前Google Guava在理论利用中十分宽泛,本篇博客将以博主对Guava应用的意识以及在我的项目中的教训来给大家分享!正如题目所言,学习应用Google Guava能够让你高兴编程,写出优雅的JAVA代码!
以面向对象思维解决字符串:Joiner/Splitter/CharMatcher

JDK提供的String还不够好么?
兴许还不够敌对,至多让咱们用起来还不够爽,还得操心!
举个栗子,比方String提供的split办法,咱们得关怀空字符串吧,还得思考返回的后果中存在null元素吧,只提供了前后trim的办法(如果我想对两头元素进行trim呢)。
那么,看上面的代码示例,guava让你不用在操心这些:

Joiner/Splitter
Joiner是连接器,Splitter是分割器,通常咱们会把它们定义为static final,利用on生成对象后在利用到String进行解决,这是能够复用的。要晓得apache commons StringUtils提供的都是static method。
更加重要的是,guava提供的Joiner/Splitter是通过充沛测试,它的稳定性和效率要比apache高出不少,这个你能够自行测试下~
举荐浏览:试试 StringJoiner,真香!
发现没有咱们想对String做什么操作,就是生成本人定制化的Joiner/Splitter,如许直白,简略,晦涩的API!
对于Joiner,罕用的办法是 跳过NULL元素:skipNulls() / 对于NULL元素应用其余代替:useForNull(String)
对于Splitter,罕用的办法是:trimResults()/omitEmptyStrings()。留神拆分的形式,有字符串,还有正则,还有固定长度宰割(太贴心了!)
其实除了Joiner/Splitter外,guava还提供了字符串匹配器:CharMatcher

CharMatcher
CharMatcher,将字符的匹配和处了解耦,并提供丰盛的办法供你应用!
对根本类型进行反对

guava对JDK提供的原生类型操作进行了扩大,使得性能更加弱小!

Ints
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 Code
Multiset自带一个有用的性能,就是能够跟踪每个对象的数量。
Immutable vs unmodifiable
来咱们先看一个unmodifiable的例子:

unmodifiable
你看到JDK提供的unmodifiable的缺点了吗?Java汇合系列面试题我都整顿好了,关注公众号Java技术栈回复 “面试” 获取。
实际上,Collections.unmodifiableXxx所返回的汇合和源汇合是同一个对象,只不过能够对汇合做出扭转的API都被override,会抛出UnsupportedOperationException。
也即是说咱们扭转源汇合,导致不可变视图(unmodifiable View)也会发生变化,oh my god!
当然,在不应用guava的状况下,咱们是怎么防止下面的问题的呢?

defensive copies
下面揭示了一个概念:Defensive Copies,保护性拷贝。
OK,unmodifiable看上去没有问题呢,然而guava仍然感觉能够改良,于是提出了Immutable的概念,来看:

Immutable
就一个copyOf,你不会遗记,如此cheap~
用Google官网的说法是:we’re using just one class,just say exactly what we mean,很了不起吗(不仅仅是个概念,Immutable在COPY阶段还思考了线程的并发性等,很智能的!),O(∩_∩)O哈哈~
guava提供了很多Immutable汇合,比方ImmutableList/ImmutableSet/ImmutableSortedSet/ImmutableMap/…
看一个ImmutableMap的例子:

ImmutableMap
可不可以一对多:Multimap
JDK提供给咱们的Map是一个键,一个值,一对一的,那么在理论开发中,显然存在一个KEY多个VALUE的状况(比方一个分类下的书本),咱们往往这样表白:Map<k,List>,如同有点臃肿!臃肿也就算了,更加不爽的事,咱们还得判断KEY是否存在来决定是否new 一个LIST进去,有点麻烦!更加麻烦的事件还在后头,比方遍历,比方删除,so hard…
来看guava如何替你解决这个大麻烦的:

Multimap
情谊提醒下,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 / 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
Table波及到3个概念:rowKey,columnKey,value,并提供了多种视图以及操作方法让你更加轻松的解决多个KEY的场景。
函数式编程:Functions

Functions
下面的代码是为了实现将List汇合中的元素,先截取5个长度,而后转成大写。
函数式编程的益处在于在汇合遍历操作中提供自定义Function的操作,比方transform转换。咱们再也不须要一遍遍的遍历汇合,显著的简化了代码!

对汇合的transform操作能够通过Function实现
断言:Predicate

Predicate最罕用的性能就是使用在汇合的过滤当中!

filter
须要留神的是Lists并没有提供filter办法,不过你能够应用Collections2.filter实现!举荐浏览:Java 中初始化 List 汇合的 6 种形式。
check null and other:Optional、Preconditions
在guava中,对于null的解决伎俩是疾速失败,你能够看看guava的源码,很多办法的第一行就是:Preconditions.checkNotNull(elements);
要晓得null是含糊的概念,是胜利呢,还是失败呢,还是别的什么含意呢?

Preconditions/Optional
Cache is king

对于大多数互联网我的项目而言,缓存的重要性,显而易见!
如果咱们的利用零碎,并不想应用一些第三方缓存组件(如redis),咱们仅仅想在本地有一个性能足够弱小的缓存,很惋惜JDK提供的那些SET/MAP还不行!

CacheLoader
首先,这是一个本地缓存,guava提供的cache是一个简洁、高效,易于保护的。为什么这么说呢?因为并没有一个独自的线程用于刷新 OR 清理cache,对于cache的操作,都是通过拜访/读写带来的,也就是说在读写中实现缓存的刷新操作!
其次,咱们看到了,咱们十分艰深的通知cache,咱们的缓存策略是什么,SO EASY!在如此简略的背地,是guava帮忙咱们做了很多事件,比方线程平安。
让异步回调更加简略

JDK中提供了Future/FutureTask/Callable来对异步回调进行反对,然而还是看上去挺简单的,能不能更加简略呢?比方注册一个监听回调。

异步回调
咱们能够通过guava对JDK提供的线程池进行装璜,让其具备异步回调监听性能,而后在设置监听器即可!
Summary

到这里,这篇文章也只介绍了guava的冰山一角,其实还有很多内容:

guava package
比方反射、注解、网络、并发、IO等等
好了,心愿这篇文章让你疾速进阶,高兴编程!

作者:张丰哲
出处:www.jianshu.com/p/97778b21bd00

总结了一些2020年的面试题,这份面试题的蕴含的模块分为19个模块,别离是: Java 根底、容器、多线程、反射、对象拷贝、Java Web 、异样、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM 。

获取材料以上材料:关注公众号:有故事的程序员,获取学习材料。
记得点个关注+评论哦~