Guava学习笔记(一)

Joiner Class


Google Guava github源码地址:https://github.com/google/guava


在平时Java开发中,字符串拼接是比较常见的,通常会见到以下Code:

public String buildString(List<String> stringList, String delimiter){
        StringBuilder builder = new StringBuilder();
        for (String s : stringList) {
            if(s !=null){
                builder.append(s).append(delimiter);
            } }
        builder.setLength(builder.length() - delimiter.length());
        return builder.toString();
    }

那么用Joiner怎么实现上述功能呢?只需要一行代码即可实现

Joiner.on(delimiter).skipNulls().join(stringList)

如果想替换空值,也可以使用下面的Code:

Joiner.on(delimiter).useForNull("null").join(stringList);

这样的话stringList中的null在最终结果中会转为字符串"null"。


注意点:

1、不仅仅是字符串,Joiner可以拼接任何Object,此时,Joiner会调用每个元素的object.toString()方法进行最终结果的拼接。

2、一但Joiner实例被创建出来,那么它就是不可变的,因此它是线程安全的。

看下面几个例子:

(1)      

List<String> test = Lists.newArrayList("1","2",null);
System.out.println(Joiner.on("|").useForNull("missing").join(test));
输出结果为:1|2|missing

(2)

List<String> test = Lists.newArrayList("1","2",null);
Joiner stringJoiner = Joiner.on("|");
stringJoiner.useForNull("missing");
System.out.println(stringJoiner.join(test));
此时会抛出异常:Exception in thread "main" java.lang.NullPointerException
(3)

Joiner stringJoiner = Joiner.on("|");
System.out.println(stringJoiner);
stringJoiner.useForNull("missing");
System.out.println(stringJoiner);
System.out.println(Joiner.on("|"));
System.out.println(Joiner.on("|").useForNull("missing"));
输出结果:

com.google.common.base.Joiner@7d2a1e44
com.google.common.base.Joiner@7d2a1e44
com.google.common.base.Joiner@5829428e
com.google.common.base.Joiner$1@7cd0a5d9

可以看出在Joiner stringJoiner = Joiner.on("|");创建一个Joiner实例stringJoiner后,这个实例不可变的,那么stringJoiner.useForNull("missing");这个方法没有生效。同时看下userForNull源码,知道Joiner中的userForNull会新建一个Joiner实例,那么可以解释后面两个打印的结果了。

public Joiner useForNull(final String nullText) {
    checkNotNull(nullText);
    return new Joiner(this) {
      @Override CharSequence toString(@Nullable Object part) {
        return (part == null) ? nullText : Joiner.this.toString(part);
      }

      @Override public Joiner useForNull(String nullText) {
        throw new UnsupportedOperationException("already specified useForNull");
      }

      @Override public Joiner skipNulls() {
        throw new UnsupportedOperationException("already specified useForNull");
      }
    };
  }


Splitter Class


顾名思义,Splitter Class是Joiner Class的反向过程,它用来以指定的字符来分割字符串。

一下是常见string分割的例子:

String testString = "Monday,Tuesday,,Thursday,Friday,,";
String[] parts = testString.split(",");
最终的parts数组结果:Monday,Tuesday,,Thursday,Friday

可见原始字符串的最后两个空串被忽略了。而Splitter Class可以解决这个问题。

Splitter.on(",").split(testString)
打印出的数组结果是:[Monday, Tuesday, , Thursday, Friday, , ]


Splitter Class和Joiner Class一样,也是一旦实例被创建起来之后就不会再改变,用法一样。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值