玩转Guava(一)
前言:Google Guava和Apache Commons具有相似的功能,Guava库提供了很多优秀的功能为了弥补Java中很多不足,Guava库与2007年开源,至今都为活跃的迭代状态,可见其生命力的顽强,所以Guava库很是值得学习。
Optional NPE终结者
作为java开发人员,无论是新手小白还是开发老手都无法避免NPE问题,很多时候null 都是一种模糊的含义,比如通过Map的get 方法获取key对应的值,结果返回了 null ,那这个null 表示 key对应的值是null,还是Map中不包含这个key?所以null的意义就很模糊,作为解决NPE的常规办法也就是牢记一条定理:使用前请考虑清楚是否为null 。但是Guava提供了Optional接口来使null快速失败,即在可能为null的对象上做了一层封装,在使用Optional静态方法of时,如果传入的参数为null就抛出NullPointerException异常。这样就逼迫开发者去思考null问题。
Optional作为一个抽象类,提供以上方法,讲解其中主要的方法。
-
Optional.of(T):获得一个Optional对象,其内部包含了一个非null的T数据类型实例,若T=null,则在运行时抛异常。
-
Optional.absent():获得一个Optional对象,其内部包含了null(即空值)。
-
Optional.fromNullable(T):将一个T的实例转换为Optional对象,T的实例可以不为空,也可以为空;即Optional.fromNullable(null)和Optional.absent()是等价的。
-
boolean isPresent():如果Optional包含的T实例不为null,则返回true;若T实例为null,返回false。
-
T get():返回Optional包含的T实例,该T实例必须不为空;否则,对包含null的Optional实例调用get()会抛出一个IllegalStateException异常。
-
T or(T):若Optional实例中包含了传入的T的相同实例,返回Optional包含的该T实例,否则返回输入的T实例作为默认值。
-
T orNull():返回Optional实例中包含的非空T实例,如果Optional中包含的是空值,返回null,逆操作是fromNullable()。
-
Set asSet():返回一个不可修改的Set,该Set中包含Optional实例中包含的所有非空存在的T实例,且在该Set中,每个T实例都是单态,如果Optional中没有非空存在的T实例,返回的将是一个空的不可修改的Set。
示例代码:
我们在使用对象是还是进行了value.isPresent()
进行判断,和普通的null判断代码相比,并未更加优雅和简洁,不同的是Optional 包含的对象会让使用者更加注意,避免遗忘处理空值!这也是Optional最为朴实的意义。在Java8 中也有Optional的身影,多少也是借鉴了Guava的这种思想来做的。
Joiner Splitter CharMatcher 字符串操作利器
Joiner 连接器
常用方法说明:
- Joiner.on():可以直接通过string或者char 来创建连接器,将被连接的的字符都会以传入的连接符连接。
- Join.join():被连接的字符,支持Iterator,数组等类型。
- Join.userForNull :连接时将null替换成对应的字符串。
- Join.skipNulls: 连接时跳过null。
- Join.withKeyValueSeparator:连接key value形式的数据值key value 之间的分隔符。
示例代码:
Splitter 拆分器
有一个问题得思考,为什么分隔字符不使用java提供的split的方法?而要使用Guava提供的拆分器进行字符分割?使用过Java 提供的split方法的人都会觉得很难用,总是会出现一些奇怪的结果,比如",a,,b,".split(",")
的代的结果是"", "a", "", "b"
最后一个","分隔后的结果被舍弃,中间部分却全部保留了,所以得到结果后我们还得进行一系列处理才能用,Guava 的Splitter 就是弥补了
方法说明:
- Splitter.on() : 基于特定字符,某些类别,字符串,正则表达式划分。
- Splitter.fixedLength():按指定长度划分,最后部分可以小于指定长度但不能为空。
- Splitter.omitEmptyStrings():移去结果中的空字符串。
- Splitter.trimResults():将结果中的空格删除,等价于
trimResults(CharMatcher.WHITESPACE)
。 - Splitter.limit():达到指定数目后停止字符串的划分。
- Splitter.withKeyValueSeparator():分隔字符串获得
Joiner.MapJoiner
对象。
CharMatcher 匹配器
在操作字符串时通常无法避开两个问题,1. 匹配到对应的字符串 2. 对匹配的字符串进行对应的操作,Guava提供了CharMatcher工具类专门来处理以上两个问题。
常用方法说明:
- CharMatcher.is/isNot()):判断字符串是否能匹配到目的字符串。
- CharMatcher.anyof/noneOf():表明你想(不)匹配的所有字符,例如:
CharMatcher.anyOf("abc")
可以匹配包含abc任意一个字母的字符串。 - CharMatcher.inRange():表明你想匹配的一个字符范围,例如:
CharMatcher.inRange('a', 'z')
。 - CharMatcher.collapseFrom():将一组连续匹配的字符串替换为一个指定的字符。例如:
WHITESPACE.collapseFrom(string, ' ')
可以将连续的空字符串替换为单个字符。 - CharMatcher.matchsAllOf/matchesNoneOf():测试字符序列是否全部匹配。
- CharMatcher.removeFrom():将匹配的字符序列移除。
- CharMatcher.retainFrom():将没有匹配的字符序列移除。
- CharMatcher.trimFrom():去除开头和结尾匹配的部分,类似于Java trim()移除空。
- CharMatcher.countIn():计数字符串出现的次数,如:
CharMatcher.is('a').countIn("aaa"); // 3
。 - CharMatcher.IndexIn():查找字符出现的位置,如:
CharMatcher.is('a').indexIn("java"); //1
。