Google Guava提供了Joiner類專門用來連接String。
譬如說有個String數組,里面有"a","b","c",我們可以通過使用StringBuilder來創建String "a,b,c"。
Joiner提供了這一類的功能。
譬如:
- Joiner joiner = Joiner.on(";");
- assertEquals("a;b;c", joiner.join(new String[}{"a","b","c"}));
當然Joiner.join還提供了參數為Iterable的overload形式。也就是說你可以傳各種List和Set。
如果被連接String里面要過濾null,可以這樣:
- Joiner joiner = Joiner.on(";").skipNulls();
- assertEquals("a;c", joiner.join(new String[]{"a",null,"c"}));
或者對null進行替換操作:
- Joiner joiner = Joiner.on(";").useForNull("!");
- assertEquals("a;!;c", joiner.join(new String[]{"a",null,"c"}));
Joiner還提供了appendTo函數,對傳入的StringBuilder作處理:
- Joiner joiner = Joiner.on(";");
- StringBuilder ab = new StringBuilder("start: ");
- assertEquals("start: a;b;c", joiner.appendTo(ab, new String[]{"a","b","c"}).toString());
除此之外,相關的MapJoiner類也利用Joiner提供了Map的join功能:
- Map<Integer, String> map = new HashMap<Integer, String>();
- map.put(1, "a");
- map.put(2, "b");
- MapJoiner joiner = Joiner.on(";").withKeyValueSeparator("->");
- assertEquals("1->a;2->b", joiner.join(map));
需要注意的是Joiner類是immutable的。換言之,它是線程安全的,你可以把它static final來用沒問題。但是這樣的話,正如javadoc所舉的例子:
// Bad! Do not do this!
Joiner joiner = Joiner.on(',');
joiner.skipNulls(); // does nothing!
return joiner.join("wrong", null, "wrong");
第1行的Joiner對象就是第3行的對象,第2行的skipNulls()其實是返回一個Joiner的一個匿名子類,而對之前的joiner對象沒有影響,所以第3行的Joiner對象根本沒有skip null的功能。