使用Joiner
典型的使用原生的java處理拼接字符串的方法:
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();
}
注意:這里需要移除最后一個(gè)分隔符。
原生的java實(shí)現(xiàn)其實(shí)也不是很復(fù)雜,但是使用Google Guava類庫(kù)中的Joiner來實(shí)現(xiàn)的話更加簡(jiǎn)潔:
Joiner.on("|").skipNulls().join(stringList);
上面的skipNulls方法是忽略了stringList中為null的空值。當(dāng)然,Joiner中也可以指定空值得替代,比如如下的代碼:
Joiner.on("|").useForNull("no value").join(stringList);
有幾點(diǎn)需要說明:Joiner類不僅能處理String類型的數(shù)據(jù),還能處理數(shù)組,迭代對(duì)象以及任何對(duì)象的可變參數(shù)類。其實(shí)也是調(diào)用了Object的toString()方法。另外如果空值存在集合中,并且skipNulls活著useForNull都沒有指定的話,NullPointerException異常將會(huì)拋出。還有,一旦Joiner對(duì)象創(chuàng)建,將會(huì)是不變的。比如如下的useForNull將不會(huì)起任何作用:
Joiner stringJoiner = Joiner.on("|").skipNulls();
//the useForNull() method returns a new instance of the Joiner!
stringJoiner.useForNull("missing");
stringJoiner.join("foo","bar",null);
Joiner類不僅可以返回String對(duì)象,還可以返回StringBuilder對(duì)象:
StringBuilder stringBuilder = new StringBuilder();
Joiner joiner = Joiner.on("|").skipNulls();
//returns the StringBuilder instance with the values foo,bar,baz appeneded with "|" delimiters
joiner.appendTo(stringBuilder,"foo","bar","baz")
Joiner類可以作用于實(shí)現(xiàn)了Appendable的所有類:
FileWriter fileWriter = new FileWriter(new File("path")):
List<Date> dateList = getDates();
Joiner joiner = Joiner.on("#").useForNulls(" ");
//returns the FileWriter instance with the valuesappended into it
joiner.appendTo(fileWriter,dateList);
Joiner類也可以作用于Map對(duì)象:
public void testMapJoiner() {
//Using LinkedHashMap so that the original order is preserved
String expectedString = "Washington D.C=Redskins#New York City=Giants#Philadelphia=Eagles#Dallas=Cowboys";
Map<String,String> testMap = Maps.newLinkedHashMap();
testMap.put("Washington D.C","Redskins");
testMap.put("New York City","Giants");
testMap.put("Philadelphia","Eagles");
testMap.put("Dallas","Cowboys");
String returnedString = Joiner.on("#").withKeyValueSeparator("=").join(testMap);
assertThat(returnedString,is(expectedString));
}