最近在給客戶準備一個Guava的分享,因此會陸續的更新關於Guava更多的細節分享。本文將記錄Guava中得字符串處理Joiner(鏈接)和Splitter(分割)處理。java
Joiner
首先咱們來看看下面咱們常常碰見的一個案例:app
題目: 對於一個以下定義List List<String> list = new ArrayList<String>("1", "2", null, 「3」); 按照’,’分割,並過濾掉null。
若是不用第三方庫,如common-lange,Guava,用原生java,咱們將怎麼繼續?ui
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public static String join(List stringList, String delimiter) { StringBuilder builder = new StringBuilder(); for (Object item : stringList) { if (item != null) { builder .append(item) .append(delimiter); } } builder.setLength(builder.length() delimiter.length()); return builder.toString(); } |
是否是很簡單,可是繁瑣,並且這裏還有個坑,咱們使用append的方式,在每次for完成後,咱們必須去修正remove最後的分隔符:builder.setLength(builder.length() delimiter.length());編碼
Guava版本呢?url
1 2 3 4 5 6 |
public static String joinByGuava(List stringList, String delimiter) { return Joiner .on(delimiter) .skipNulls() .join(stringList); } |
咱們不在考慮更多的細節,而且頗有語義的告訴代碼的閱讀者,用什麼分隔符,須要過濾null值再join。spa
note:固然咱們也能夠用common-lange來很簡單的完成:StringUtils.join(stringList, delimiter).可是我的推薦儘可能使用Guava替代common-lange,由於Guava還有更多的有用方法,後續會陸續介紹,還有就是Guava的API相對更有語意一點。code
Splitter
MapJoinner和MapSplitter
對於MapJoinner和MapSplitter的最好案例就是url的param編碼。對象
MapJoinner
題目: 生產一個查詢id: 123,name: green的學生信息的url。
利用Guava的MapJoinner的代碼以下:ip
1
|
Joiner.on("&").withKeyValueSeparator("=").join(ImmutableMap.of("id", "123", "name", "green")); |
這裏採用了on傳入map item之間分隔符,以及withKeyValueSeparator傳遞map項key/value之間的分隔符。因此可以很簡單的實現,不用咱們在去實現一個的for循環代碼。rem
MapSplitter
題目: 對url中的查詢字符串"id=123&name=green"進行分割
利用Guava的MapSplitter的代碼以下:
1
|
final Map<String, String> join = Splitter.on("&").withKeyValueSeparator("=").split("id=123&name=green"); |
這裏一樣利用on傳入字符串的第一分隔符,withKeyValueSeparator傳入項的分隔符,產生map的key/value項,其結果是一個{id=123, name=green}的Map對象。