为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程

九路 等级 943 1 1
标签: jdk后端

前言

阿里巴巴出了一本Java规范,在国内java开发眼里被赋予了神圣的殿堂,我不推荐你用阿里巴巴的开发手册。

目前Google Guava在实际应用中非常广泛,本篇博客将以博主对 Guava 使用的认识以及在项目中的经验来给大家分享!学习使用 Google Guava可以让你快乐编程,写出优雅的 Java 代码,在业务允许的条件下,我推荐使用 Guava编程!Google 出品 Java 编码规范,科学又权威,强烈推荐!

Joiner/Splitter/CharMatcher

JDK提供的String还不够好么?

也许还不够友好,至少让我们用起来还不够爽,还得操心!

举个栗子,比如String提供的split方法,我们得关心空字符串吧,还得考虑返回的结果中存在null元素吧,只提供了前后trim的方法(如果我想对中间元素进行trim呢)。

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

为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程

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

为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程

CharMatcher,将字符的匹配和处理解耦,并提供丰富的方法供你使用!

对基本类型的支持

guava对JDK提供的原生类型操作进行了扩展,使得功能更加强大

为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程

guava提供了Bytes/Shorts/Ints/Iongs/Floats/Doubles/Chars/Booleans这些基本数据类型的扩展支持,只有你想不到的,没有它没有的!

对 JDK 的有效补充

灰色地带:Multiset

JDK的集合,提供了有序且可以重复的List,无序且不可以重复的Set。那这里其实对于集合涉及到了2个概念,一个order,一个dups。那么List vs Set,and then some ?

为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程

Multiset

Multiset是什么,我想上面的图,你应该了解它的概念了。Multiset就是无序的,但是可以重复的集合,它就是游离在List/Set之间的“灰色地带”!(至于有序的,不允许重复的集合嘛,guava还没有提供,当然在未来应该会提供UniqueList,我猜的,哈哈)

来看一个Multiset的示例:

为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程

Multiset自带一个有用的功能,就是可以跟踪每个对象的数量。

Immutable vs unmodifiable

来我们先看一个unmodifiable的例子:

为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程

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

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

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

当然,在不使用guava的情况下,我们是怎么避免上面的问题的呢?

为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程

上面揭示了一个概念:Defensive Copies,保护性拷贝。

OK,unmodifiable看上去没有问题呢,但是guava依然觉得可以改进,于是提出了Immutable的概念,来看:

为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程

就一个copyOf,你不会忘记,如此cheap

用Google官方的说法是:we're using just one class,just say exactly what we mean,很了不起吗(不仅仅是个概念,Immutable在COPY阶段还考虑了线程的并发性等,很智能的!)

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

看一个ImmutableMap的例子:

为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程

可不可以一对多:Multimap

*JDK提供给我们的Map是一个键,一个值,一对一的,那么在实际开发中,显然存在一个KEY多个VALUE的情况(比如一个分类下的书本),我们往往这样表达:Map<k,List>,好像有点臃肿!臃肿也就算了,更加不爽的事,我们还得判断KEY是否存在来决定是否new 一个LIST出来,有点麻烦!更加麻烦的事情还在后头,比如遍历,比如删除,so hard......
*

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

为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程

友情提示下,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.

为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程

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。

为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程

Table涉及到3个概念:rowKey,columnKey,value,并提供了多种视图以及操作方法让你更加轻松的处理多个KEY的场景。

函数式编程:Funcitons

为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程

上面的代码是为了完成将List集合中的元素,先截取5个长度,然后转成大写。

函数式编程的好处在于在集合遍历操作中提供自定义Function的操作,比如transform转换。我们再也不需要一遍遍的遍历集合,显著的简化了代码!

为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程

对集合的transform操作可以通过Function完成

断言:Predicate

Predicate最常用的功能就是运用在集合的过滤当中!

为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程

需要注意的是Lists并没有提供filter方法,不过你可以使用Collections2.filter完成!

check null and other:Optional、Preconditions

在guava中,对于null的处理手段是快速失败,你可以看看guava的源码,很多方法的第一行就是:Preconditions.checkNotNull(elements);

要知道null是模糊的概念,是成功呢,还是失败呢,还是别的什么含义呢?

为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程

Cache

对于大多数互联网项目而言,缓存的重要性,不言而喻!

如果我们的应用系统,并不想使用一些第三方缓存组件(如redis),我们仅仅想在本地有一个功能足够强大的缓存,很可惜JDK提供的那些SET/MAP还不行!

为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程

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

其次,我们看到了,我们非常通俗的告诉cache,我们的缓存策略是什么,SO EASY!在如此简单的背后,是guava帮助我们做了很多事情,比如线程安全。

让异步回调更加简单

JDK中提供了Future/FutureTask/Callable来对异步回调进行支持,但是还是看上去挺复杂的,能不能更加简单呢?比如注册一个监听回调。

为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程

我们可以通过guava对JDK提供的线程池进行装饰,让其具有异步回调监听功能,然后在设置监听器即可!

到这里,这篇文章也只介绍了guava的冰山一角,其实还有很多内容:比如反射、注解、网络、并发、IO等等,好了,希望这篇文章让你快速进阶,快乐编程!

你现在还想用阿里巴巴的编码规范吗?

收藏
评论区

相关推荐

为什么不建议Java程序员用阿里巴巴规范,而使用GoogleGuava编程
前言 阿里巴巴出了一本Java规范,在国内java开发眼里被赋予了神圣的殿堂,我不推荐你用阿里巴巴的开发手册。 目前Google Guava在实际应用中非常广泛,本篇博客将以博主对 Guava 使用的认识以及在项目中的经验来给大家分享!学习使用 Google Guava可以让你快乐编程,写出优雅的 Java 代码,在业务允许的条件下,我推荐使用 Guav
IDEA 正式版终于支持中文版和 JDK 直接下载了(太方便了)附介绍视频
IDEA 2020.1 经过了漫长的打磨终于发布正式版了,而这次的版本不止直接支持 Java 14,还带来了两个重量级的功能,官方中文版支持和 JDK 直接下载。 在之前的开发中,当我们需要下载 JDK 时,通常的步骤是这样的:首先去 Oracle 的官网,查到相关的版本下载地址,然后输入用户输入密码登录成功之后才能下载相应的 JDK,尤其是对于那些经常忘
JAVA从头回顾
概述 ==         前段时间忙于面试,在面试过程中,发现工作几年,有很多基础有些淡忘了,现在重新从基础开始回顾,JAVA从入门到放弃系列博文将会记录一下基于JDK1.6在工作中不常用而容易忘记,但是有必须要掌握的一些知识点, 本篇先从java环境相关的知识点写起 JDK和JRE关系 =========     开始学习JAVA开发时,首先就需要
JDK和JRE的关系
JDK(Java Development Kit)是我们学习Java首先要安装的软件,JDK安装完成之后,安装向导会询问我们是否安装JRE(Java Runtime Environment),那到底还要不要安装呢?回答这个问题前,首先要知道JDK和JRE是什么关系。 **啥是JDK,啥是JRE** 我们看看来自百度百科的解释: > JDK是 J
JDK的下载与Java运行环境
**JDK简介** **什么是JDK** JDK是Java Development Kit的缩写,意思是Java开发工具包。JDK就好比作人的心脏,人没有了心脏,生命也就失去存在的意义。Java也一样,JDK就是它的心脏,是它的核心。JDK中不仅有Java运行环境(Java Runtime Environment),还有Java工具与Java的核心类库
Java基础学习总结(19)——Java环境变量配置
**前言** ------ 学习java的第一步就要搭建java的学习环境,首先是要安装JDK,JDK安装好之后,还需要在电脑上配置"JAVA\_HOME”、"path”、"classpath"这三个环境变量才能够把java的开发环境搭建好。在没安装过jdk的环境下,path环境变量是系统变量,本来存在的,而JAVA\_HOME和classpath是不存
Java的JDK到底是什么?Java JDK小白安装教程(win10)!
小白的Java JDK安装教程(win10): ----------------------- Java JDK安装3步走,手把手教小白安装Java JDK! * **Java JDK**是干什么用的?如何安装? * 安装完 Java JDK 为什么要设置**环境变量**? * 如何设置Java JDK 环境变量 一、Java JDK 是干
Java程序运行机制及开发环境
### **Java既是编译型语言,又是解释型语言** java源文件首先需要通过javac编译生成后缀名为.class的字节码文件(与平台无关,只面向JVM),然后使用Java虚拟机将字节码解释成特定平台上的机器码运行。 ###**Java虚拟机JVM** 不同平台上的JVM不同,但是都提供了相同的接口。 ###**开发Java准备** 1. 下
java 安装环境
网上关于win10 jdk安装、配置环境变量的经验有很多,但是按照方法配置后出现了运行javac 报告javac不是内部或外部命令,但是运行java、java-version正常。并不是说那些经验不正确,而是不够详细,容易出错。 工具/原料 ----- * Windows 10 * jdk安装文件 第一步,下载jdk安装文件
java基础知识随身记
2018年11月12日20:51:35 一、基础知识: 1、JVM、JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性。   java语言是跨平台,jvm不是跨平台的。 JRE(Java Runtime Environment):java的运行环境,包括jvm+java的核心类
ubuntu系列
**1、安装jdk** eclipse是使用java语言开发的,一个java应用程序的运行要在java虚拟机下。在没有安装jdk的前提下,即使在ubuntu上安装了eclipse也不能使用。 (1)首先在官网上下载jdk:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downl
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口
Tomcat介绍 ======== * ##### Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 * ##### java程序写的网站用tomcat+jdk来运行 * ##### to
Tomcat环境搭建
本文索引: * Tomcat介绍 * 安装JDK * 安装Tomcat * * * ### Tomcat介绍 Tomcat是apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由apache、Sun和其他一些公司及个人共同开发而成。 JAVA不仅可以用于网站开发,也可以开发
tcnative
* 原因:出现上面的错误多是 JDK 和 Tomcat 位数不一致导致。 ![](https://static.oschina.net/uploads/space/2017/0808/120623_jOxi_3471319.png) 使用如下命令查看环境变量中 JDK 的版本。 * java -version
tomcat配置
要使用Tomcat,首先需要安装jdk,JDK的全称是Java Development Kit,是Sun公司免费提供的Java语言的软件开发工具包,其中包含Java虚拟机(JVM) jvm虚拟机的作用就是把高级语言-----》编译成字节码-----》通过运算得出结果----》最后把东西发布 利用JVM解释这些字节码文件,从而保证了Java的跨平台性 安