Joiner用来完成字符串的拼接
简单实例
使用guava创建一个包含a,b,c 3个元素的 ArrayList
List<String> lists = Lists.newArrayList("a", "b", "c");
如果要List中的元素用一个分隔符(“|”)连接起来。常用做法如下:
StringBuilder ret = new StringBuilder();
for(String ele:lists){
ret.append(ele).append("|");
}
ret.setLength(ret.length()-1);//去掉最后一个分隔符"|"
使用guava的话是这样的:
Joiner.on("|").join(lists);//结果是:a|b|c
可以看出来比以前简洁了很多
对于null的处理
如果上面的list中有null元素,使用Joiner.on("|").join(lists)
就或抛出NPE(NullPointerException
)异常,这时候可以用skipNulls
或useForNull
方法。
- skipNulls:忽略null
- userForNull:替换null
List<String> lists = Lists.newArrayList("a", "b", "c",null);
Joiner joiner = Joiner.on("|");
//joiner.join(lists); 抛出异常
joiner.skipNulls().join(lists); //忽略null,结果是: a|b|c
joiner.useForNull("*").join(lists); //替换null,结果是: a|b|c|*
Joiner不可变性
Joiner实例都是不可变的,所以Joiner实例都是线程安全的,因此我们可以把Joiner实例声明为static final
的。每个Joiner的操作都会生成一个新的Joiner实例。
比如下面的代码,joiner
是一个实例,使用skipNulls
方法后又产生一个实例skipNullJoiner
,原来的joiner
实例不会受影响。
Joiner joiner = Joiner.on("|");
Joiner skipNullJoiner=joiner.skipNulls();
Joiner使用对象
joiner不仅可以用来连接Iterable
、Iterator
、变长参数、数组
还可以用作Appendable
接口的实例比如(StringBuilder
,FileWriter
)
List<String> lists = Lists.newArrayList("a", "b", "c",null);
Joiner joiner = Joiner.on("|").useForNull("*");
StringBuilder sb = new StringBuilder();
joiner.appendTo(sb, lists);
System.out.println(sb); //输出 a|b|c|*
MapJoiner
Joiner用来连接线性表的,MapJoiner可以用来连接map
HashMap<String, String> map = Maps.newHashMap();
map.put("a", "11");
map.put("b", "22");
map.put("c", "33");
Joiner.MapJoiner mapJoiner = Joiner.on(",").withKeyValueSeparator("=");
String join = mapJoiner.join(map);//输出 b=22,c=33,a=11
参照:
1、《getting started with google guava》