目前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高出不少,这个你可以自行测试下~发现没有我们想对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的缺陷了吗?实际上,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<v>>,好像有点臃肿!臃肿也就算了,更加不爽的事,我们还得判断KEY是否存在来决定是否new 一个LIST出来,有点麻烦!更加麻烦的事情还在后头,比如遍历,比如删除,so hard......

来看guava如何替你解决这个大麻烦的:

Multimap

友情提示下,guava所有的集合都有create方法,这样的好处在于简单,而且我们不必在重复泛型信息了。get()/keys()/keySet()/values()/entries()/asMap()都是非常有用的返回view collection的方法。Multimap的实现类有:ArrayListMultimap/HashMultimap/LinkedHashMultimap/TreeMultimap/ImmutableMultimap/......

        Multimap<String, String> createMultiMap = ArrayListMultimap.create();
        createMultiMap.put("系统实体id", "词条1");
        createMultiMap.put("系统实体id", "词条2");
        createMultiMap.put("tel", "telephone");
        System.out.println(createMultiMap.get("系统实体id"));
        createMultiMap.remove("系统实体id", "词条1");
        System.out.println(createMultiMap.get("系统实体id"));

可不可以双向: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完成!

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的冰山一角,其实还有很多内容:

另外本人从事在线教育多年,将自己的资料整合建了一个QQ群,对于有兴趣一起交流学习C/C++的可以加群:825414254,里面有大神会给予解答,也会有许多的资源可以供大家学习分享,欢迎大家前来一起学习进步!

作者:C语言学习圈
链接:https://www.jianshu.com/p/ea44224b9cba
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

为什么强烈推荐Java程序员使用Google Guava编程(思大于行,思行合一)相关推荐

  1. 为什么推荐 Java 程序员使用 Google Guava 编程

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来自 | 张丰哲 链接 | www.jianshu.com/p/97778b21bd00 前言 ...

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

    点击上方"码农突围",马上关注 这里是码农充电第一站,回复"666",获取一份专属大礼包 真爱,请设置"星标"或点个"在看&quo ...

  3. 优秀的Java程序员应具备哪些编程技术?

    想要成为一名合格的java程序猿,需要学习的知识是有很多的,但是基础知识一定要非常牢固,基础不牢固的程序员,随时都会被新的知识和技术所淘汰,下盘不稳风一吹就倒,那么具体作为一个优秀的Java程序员应具 ...

  4. 推荐Java程序员阅读的书籍

    作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水 ...

  5. 阿里P8大牛推荐Java程序员必看的 13 本 Java 书籍

    关乎于程序员,除了做项目来提高自身的技术,还有一种提升自己的专业技能就是:多!看!书! 毕竟,书是学习的海洋呢!So,Java程序员你们准备好了吗?双手奉上Java程序员必读之热门书单. 在下面这 1 ...

  6. java原生的编译软件_原生态Java 程序员容易忽视的编程细节

    Java是Java程序设计语言和Java平台的总称,要想学好一门语言,打好基础最关键的,学习一种新的编程语言比学习新的口头语言要容易得多.然而,在这两种学习过程中,都要付出额外的努力去学习不带口音地说 ...

  7. Java程序员的日常—— 《编程思想》关于类的使用常识

    Java虽然利用JVM,让程序员可以放心大胆的使用,可是仍然会出现内存泄露等问题.世上没有绝对的银弹,因此也不能完全把所有的任务都交给JVM,了解Java中的初始化与垃圾回收还是必不可少的知识. 关于 ...

  8. 推荐给程序员们的十条编程原则

    对于新手程序员们来说,拥有良好的代码量积累和一定的熟练度可以顺利的上手工作:而想要进一步的提升自己的代码能力和工作效率,掌握必要的编程原则也是重要的环节. 前言 对于新手程序员们来说,拥有良好的代码量 ...

  9. 为什么我不建议你用阿里巴巴Java规范?而是使用 Google Guava 编程?

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 Themorewefind,themorewelose.Themorewek ...

最新文章

  1. 增量学习不只有finetune,三星AI提增量式少样本目标检测算法 | CVPR 2020
  2. mysql 调用webservice_C#调用Webservice的代码实现方式汇总
  3. python使用for循环打印99乘法表-python3:使用for循环打印九九乘法表
  4. 【蓝桥杯】子串分值---笔记
  5. java linkedlist 用法_Java LinkedList addLast()用法及代码示例
  6. EventTarget
  7. mariadb安装_MariaDB CentOS 安装的时候如何确定 Repo 地址
  8. SQLServer基本操作
  9. 【leetcode】动态规划优秀题目
  10. C++ std::set insert 失败 原因和解决方案 operator
  11. SHA1算法 C语言实现
  12. 节奏大师服务器不稳定,节奏大师无法登陆的原因及解决方法
  13. 微型计算机原理实验二,微型计算机原理与接口技术实验指导(第2版)
  14. 我在汉语编程留言,确引来了一顿臭骂,气愤之后,贴出来让大家评,目的让更多的人知道forth
  15. 为知笔记保存为html,为知笔记使用方法
  16. 民间文学【0006】
  17. ntext字段的替换处理示例--全表替换
  18. 【我的新书】分布式微服务架构:原理与实战
  19. 非期望产出的sbm模型_兼顾非期望产出的工业用地效率测度、分异与溯因 ——以东北三省为例...
  20. 记录秋招服务器开发面经(游戏服务器)

热门文章

  1. git 提示:can not merge due to depend on the changes that are not submit
  2. java ganymed ssh2_java ganymed-ssh2,session 执行多条指令,最好可以在前一条的基础上,执行下一条。...
  3. 薛之谦的歌用计算机谈音乐,薛之谦:用音乐诉说爱情
  4. Python canvas:简易圆盘时钟,圆盘
  5. 鼠标事件mousemove拖动到iframe上监听失效问题
  6. hadoop ----5 MR
  7. dokuwiki中文linux,CentOS 7 下搭建 Dokuwiki
  8. java 读取数据库图片二进制流并输出到jsp页面
  9. 手机app图标显示为机器人或者不显示的解决办法
  10. 隐马尔科夫模型HMM之Baum-Welch算法Python代码实现