目前,谷歌番石榴在实践中应用广泛。本博客将与您分享博主对番石榴在项目中的使用和体验的理解!学习使用谷歌番石榴可以让你快乐地编程和编写优雅的JAVA代码!
用面向对象的思想处理字符串:Joiner/Splitter/CharMatcher
JDK提供的字符串不够好吗?
可能不够友好,至少不够酷,我们用不上,还得担心!比如栗子,比如String提供的split方法,要注意string 空,考虑返回结果中是否存在null元素,只提供trim前后的方法。
然后,看看下面的代码示例,番石榴让你不用担心这些:
接合器/分离器
连接器是连接器,分路器是分割器。通常我们把它们定义为静态final。在使用on生成对象后,它们被应用于String进行处理,可以重用。理解apache commons StringUtils提供静态方法。更重要的是,番石榴提供的Joiner/Splitter已经过全面测试,稳定性和效率都比apache高很多,可以自己测试~发现如果我们不想用String做什么,那就是生成自己定制的Joiner/Splitter,这是一个直白、简单、流畅的API!对于Joiner,常见的方法是跳过空元素:skipNulls/对空元素使用其他替代方法:useForNull。对于拆分器,常见的方法是trimResults/omittemptystrings。注意拆分的方式,包括串、正则、定长拆分
事实上,除了Joiner/Splitter,番石榴还提供了一个字符串匹配器:CharMatcher
魅力管理员
CharMatcher,耦合人物的匹配和理解,提供丰富的方法供你使用!
支持基本类型
番石榴扩展了JDK提供的原生类型操作,使其更加强大!
绑定约束
Guava为基本数据类型提供扩展支持,例如字节/短/整数/长/浮点/双精度/字符/布尔。只有你想不到。
JDK系列的有效补充
灰色区域:多集
JDK的一个集合提供了一个有序且可重复的列表和一个无序且不可重复的集合。然后实际上有两个概念涉及到收集,一个订单和一个dups。然后是列表vs集合,然后是一些?
多集
什么是多集?我想你应该知道多重集合的概念。多集是一个无序但可重复的集合,是列表/集合之间的“灰色地带”!
看一个多集的例子:
多集代码
Multiset有一个有用的功能,那就是它可以跟踪每个对象的数量。
不可变与不可变
让我们先看一个不可修改的例子:
无法改变的
你见过JDK提供的不可修改的缺陷吗?实际上,Collections.unmodifiableXxx返回的集合和源集合是同一个对象,只是可以对集合进行更改的API被重写,并且将引发UnsupportedOperationException。也就是说,如果我们改变源集,不可变的视图也会改变,天啊!
当然,不使用番石榴怎么避免以上问题呢?
防御性副本
以上揭示了一个概念:防御性副本,保护性副本。
OK,不可修改似乎没问题,但是番石榴还是认为可以改进,所以他提出了不可修改的概念。听着:
不变的
只是一个copyOf,你不会忘记,这么便宜~用谷歌的官方说法:我们只用一个类,就直说我们的意思,是不是很棒?Oohaha ~番石榴提供了很多不可变集合,比如不可变列表/不可变集合/不可变排序集合/不可变映射/......
看一个不变电子邮件的例子:
不变的地图
可以是一对多:多重映射吗
JDK提供的Map是一个key,一个VALUE,一对一,所以在实际开发中,很明显有一个KEY有多个值,我们经常这样表达:Map >,看起来有点臃肿!即使臃肿,也更让人不愉快。我们要判断KEY是否存在,才能决定new是否是LIST。有点麻烦!更麻烦的事情还在后面,比如遍历,比如删除,好难......
让我们看看番石榴是如何为你解决这个大麻烦的:
多重映射
作为一个友好的提醒,所有的番石榴收藏都有创建方法,这有简单的优点,我们不必重复通用信息。get/key/key set/values/entries/asmap都是返回视图集合的非常有用的方法。Multimap的实现类有:ArrayList Multimap/HashMultimap/LinkedHashMultimap/treemmultimap/不可变Multimap/......
可以是双向的吗:BiMap
JDK提供的MAP允许我们通过key找到value,那么我们可以通过value找到key吗,KEY和VALUE都可以是唯一的吗?这是一个双向的概念,即向前+向后。实际场景中有这样的需求吗?例如,如果您通过用户标识找到邮件,您还需要通过邮件找到您的用户名。没有番石榴,我们需要创建正向图和反向图,现在就让番石榴为你做这些。
双向映射
Bimap/bimap。反向/bimap。逆。他们是什么关系?可以看看BiMap的源代码实现。其实你在创建BiMap的时候,在内部维护了两个地图,一个正向地图,一个反向地图,并设置了它们之间的关系。因此,biMap.inverse!= biMapbiMap.inverse.inverse == biMap
有可能有多个键:表吗
我们知道,除了主键之外,数据库还提供复合索引,实践中有很多这样的多级关系查找。当然,我们可以使用嵌套地图来实现它们:地图。为了让我们的代码看起来不那么难看,番石榴为我们提供了Table。
桌子
表涉及行key、列key、值三个概念,提供了多种视图和操作方法,让你更容易处理多个KEY场景。
函数式编程:函数
功能
上面的代码是把List集合中的五个长度的元素切掉,然后转换成大写。函数式编程的优点是在集合遍历操作中提供用户定义的函数操作,如变换变换。我们不再需要一遍又一遍地遍历集合,这大大简化了代码!
集合上的转换操作可以通过函数来完成
断言:谓词
谓词最常用的功能就是在集合过滤中使用!
过滤器
需要注意的是,Lists没有提供过滤方法,但是可以使用Collections2.filter来完成!
检查空值和其他:可选、前提条件
在番石榴中,空值的处理方法是快速失效。你可以看看番石榴的源代码。很多方法的第一行是:Preconditions.checkNotNull
要知道零是一个模糊的概念,它是成功、失败还是其他什么?
先决条件/可选
缓存为王
对于大多数互联网项目来说,缓存的重要性不言而喻!如果我们的应用系统不想使用一些第三方缓存组件,我们只想在本地拥有一个功能足够强大的缓存。很遗憾,JDK提供的SET/MAP无法工作!
缓存加载程序
首先,这是一个本地缓存,番石榴提供的缓存简单高效,易于维护。为什么这么说?因为不存在刷新或清理缓存的单线程,所以缓存操作都是通过访问/读写带来的,也就是说缓存刷新操作是在读写中完成的!其次,我们可以看到我们告诉缓存我们的缓存策略是什么,SO EASY!在这种简单的背后,番石榴帮助我们做了很多事情,比如线程安全。
让异步回调变得更容易
Future/FutureTask/Callable在JDK提供,支持异步回调,但看起来还是比较复杂。能简单点吗?例如,注册一个监听回调。
异步回调
我们可以通过番石榴装饰JDK提供的线程池,使其具有异步回调监听功能,然后设置监听器!
摘要
在这里,本文只介绍了番石榴的冰山一角,但仍有许多内容: