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一样,也是一旦实例被创建起来之后就不会再改变,用法一样。