玩转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作为一个抽象类,提供以上方法,讲解其中主要的方法。

  1. Optional.of(T):获得一个Optional对象,其内部包含了一个非null的T数据类型实例,若T=null,则在运行时抛异常。

  2. Optional.absent():获得一个Optional对象,其内部包含了null(即空值)。

  3. Optional.fromNullable(T):将一个T的实例转换为Optional对象,T的实例可以不为空,也可以为空;即Optional.fromNullable(null)和Optional.absent()是等价的。

  4. boolean isPresent():如果Optional包含的T实例不为null,则返回true;若T实例为null,返回false。

  5. T get():返回Optional包含的T实例,该T实例必须不为空;否则,对包含null的Optional实例调用get()会抛出一个IllegalStateException异常。

  6. T or(T):若Optional实例中包含了传入的T的相同实例,返回Optional包含的该T实例,否则返回输入的T实例作为默认值。

  7. T orNull():返回Optional实例中包含的非空T实例,如果Optional中包含的是空值,返回null,逆操作是fromNullable()。

  8. Set asSet():返回一个不可修改的Set,该Set中包含Optional实例中包含的所有非空存在的T实例,且在该Set中,每个T实例都是单态,如果Optional中没有非空存在的T实例,返回的将是一个空的不可修改的Set。

示例代码:

我们在使用对象是还是进行了value.isPresent()进行判断,和普通的null判断代码相比,并未更加优雅和简洁,不同的是Optional 包含的对象会让使用者更加注意,避免遗忘处理空值!这也是Optional最为朴实的意义。在Java8 中也有Optional的身影,多少也是借鉴了Guava的这种思想来做的。

Joiner Splitter CharMatcher 字符串操作利器

Joiner 连接器

常用方法说明:

  1. Joiner.on():可以直接通过string或者char 来创建连接器,将被连接的的字符都会以传入的连接符连接。
  2. Join.join():被连接的字符,支持Iterator,数组等类型。
  3. Join.userForNull :连接时将null替换成对应的字符串。
  4. Join.skipNulls: 连接时跳过null。
  5. Join.withKeyValueSeparator:连接key value形式的数据值key value 之间的分隔符。

示例代码:

Splitter 拆分器

有一个问题得思考,为什么分隔字符不使用java提供的split的方法?而要使用Guava提供的拆分器进行字符分割?使用过Java 提供的split方法的人都会觉得很难用,总是会出现一些奇怪的结果,比如",a,,b,".split(",") 的代的结果是"", "a", "", "b" 最后一个","分隔后的结果被舍弃,中间部分却全部保留了,所以得到结果后我们还得进行一系列处理才能用,Guava 的Splitter 就是弥补了

方法说明:

  1. Splitter.on() : 基于特定字符,某些类别,字符串,正则表达式划分。
  2. Splitter.fixedLength():按指定长度划分,最后部分可以小于指定长度但不能为空。
  3. Splitter.omitEmptyStrings():移去结果中的空字符串。
  4. Splitter.trimResults():将结果中的空格删除,等价于trimResults(CharMatcher.WHITESPACE)
  5. Splitter.limit():达到指定数目后停止字符串的划分。
  6. Splitter.withKeyValueSeparator():分隔字符串获得 Joiner.MapJoiner 对象。
CharMatcher 匹配器

在操作字符串时通常无法避开两个问题,1. 匹配到对应的字符串 2. 对匹配的字符串进行对应的操作,Guava提供了CharMatcher工具类专门来处理以上两个问题。

常用方法说明:

  1. CharMatcher.is/isNot()):判断字符串是否能匹配到目的字符串。
  2. CharMatcher.anyof/noneOf():表明你想(不)匹配的所有字符,例如:CharMatcher.anyOf("abc") 可以匹配包含abc任意一个字母的字符串。
  3. CharMatcher.inRange():表明你想匹配的一个字符范围,例如:CharMatcher.inRange('a', 'z')
  4. CharMatcher.collapseFrom():将一组连续匹配的字符串替换为一个指定的字符。例如:WHITESPACE.collapseFrom(string, ' ') 可以将连续的空字符串替换为单个字符。
  5. CharMatcher.matchsAllOf/matchesNoneOf():测试字符序列是否全部匹配。
  6. CharMatcher.removeFrom():将匹配的字符序列移除。
  7. CharMatcher.retainFrom():将没有匹配的字符序列移除。
  8. CharMatcher.trimFrom():去除开头和结尾匹配的部分,类似于Java trim()移除空。
  9. CharMatcher.countIn():计数字符串出现的次数,如:CharMatcher.is('a').countIn("aaa"); // 3
  10. CharMatcher.IndexIn():查找字符出现的位置,如: CharMatcher.is('a').indexIn("java"); //1
posted @ 2023-02-03 14:44  年年糕  阅读(38)  评论(0编辑  收藏  举报