首页 > 编程知识 正文

guava是什么东西,google神器

时间:2023-05-03 16:08:39 阅读:110381 作者:2072

点击上面的“Github爱好者社区”,选择星标回复“资料”,获得编辑整理后的资料作者沉默的铃铛

资料来源: www.jianshu.com/p/97778b21bd00

Google Guava现在已经投入使用,这个博客将与博客使用Guava分享在项目中的经验! 正如标题所示,学习Google Guava的使用方法,可以愉快地编程,写出优雅的JAVA代码!

以面向对象思想处理字符串:Joiner/Splitter/CharMatcherJDK提供的字符串还不够吗?

可能还不友好,但至少对我们还不够爽,得担心!

举个例子吧。 例如,String提供的split方法可能需要关注空字符串。 还必须考虑到返回的结果中存在null元素。 只提供了前后trim的方法(如果想对中间元素进行trim的话)。

那么,看下面的代码示例,guava让你不必在操心这些:

Joiner/SplitterJoiner是连接器,Splitter是拆分器。 通常,将它们定义为静态文件,使用on生成对象,然后将其应用于String进行处理。 这个可以复用。 要知道,apache commons StringUtils提供的都是静态方法。

更重要的是,guava提供的Joiner/Splitter经过了充分的测试,其稳定性和效率比apache高很多,这个你可以自己测试一下~

推荐:试试StringJoiner。 好香。

我们不知道我们想对String做什么,就是生成自己定制的Joiner/Splitter。 多么直率、简单、流畅的API啊!

对于Joiner,常见的方法是跳过空元素。 使用skip nulls (另一个替代为/null元素) usefornull(string )

对于Splitter,常见的方法是Trimresults(/omitemptystrings )。 请注意分割的方法。 有字符串,有正则,也有定长分割()

实际上,除了Joiner/Splitter之外,guava还提供了字符串匹配器: CharMatcher

CharMatcherCharMatcher,结合文字匹配和位置理解,提供丰富的方法!

对基本类型进行支持guava扩展了JDK提供的本机类型操作,功能更强大。

Intsguava提供对基本数据类型(如bytes/shorts/ints/iongs/floats/doubles/chars/booleans )的扩展支持。 只是你不想,没有那个。

3358 www.Sina.com/http://www.Sina.com/JDK集合提供有序可重复的List、无序不可重复的Set。 在这里,实际上对于集合涉及了2个概念,1个order,1个dups。 那么,List vs Set,and then some?

对JDK集合的有效补充

灰色地带:MultisetMultiset是什么,在上图中,我想你应该知道它的概念。 Multiset是一个无序但可重复的集合,是游离在List/Set之间的“灰色地带”! (对于有秩序、不允许重复的集合,还没有提供guava。 当然,将来应该会提供UniqueList。 我推测。 哈哈)

请看Multiset的例子:

MultisetMultiset提供了一个方便的功能,允许您跟踪每个对象的数量。

在Immutable vs unmodifiable中,我们首先看一下unmodifiable的示例。

看到33558www.Sina.com/JDK提供的unmodifiable的缺陷了吗? 整理了Java收藏系列的面试问题。 关注公众号Java技术堆栈答案“面试”的获取。

实际上,Collections.unmodifiableXxx返回的集合和源集合是同一对象,但可以对集合进行更改的所有API都是override的,unsupportedoperation

换句话说,我们改变了源代码收藏

导致不可变视图(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<v>>,好像有点臃肿!臃肿也就算了,更加不爽的事,我们还得判断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等等

好啦,今天的分享就到这儿啦,我们下次见啦~GitHub原创推荐•  GitHub狂揽12.8K+星,这个开源的网易云音乐火了!还可以解锁变灰歌曲,比VIP还牛逼!•  GitHub开源了一款程序员摸鱼神器!上班摸鱼还不会被老板发现。。。•  GitHub上买房攻略开源,一夜之间涨星近千,网友说:正好需要!•  简直太牛了!这个微信插件神器开源,怒冲GitHub排名榜第一,网友:太好用了!•  微软开源又一力作发布!刷屏GitHub!炸了。。关注「Github爱好者社区」加星标,每天带你逛Github好玩的项目

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。