Guava字串處理Joiner、Splitter

韓師學子--胖佳發表於2019-02-23

                        Guava字串處理Joiner、Splitter
 

 參考:https://blog.csdn.net/u012410733/article/details/51584086
https://www.cnblogs.com/whitewolf/p/4214749.html
https://blog.csdn.net/zbw18297786698/article/details/73223574


pom.xml

<dependency> 
<groupId>com.google.guava</groupId> 
<artifactId>guava</artifactId> 
<version>27.0.1-jre</version> 
</dependency>

先介紹com.google.common.base.Joiner。我想做為一個程式設計師我們每天和String打交道的時候是會佔很多時間的吧。以任意的字串和與一些分隔符標記連線在一起也是我們工作中經常要遇到的問題。但是用Guava--Joiner,它會讓我們更加優雅的編碼。它通常涉及把一個陣列,列表,或者一個iterable和迴圈的內容,新增StringBuilder類專案,新增分隔符。先把Joiner的方法簡單的描述一下。

A<A extends Appendable> appendTo(A appendable, Iterable<?> parts)
用來存在放通過解析預先配置的分隔符後與Iterable型別parts解析後的字串
 
A <A extends Appendable> appendTo(A appendable, Iterator<?> parts)
用來存在放通過解析預先配置的分隔符後與Iterator型別parts解析後的字串
 
A <A extends Appendable> appendTo(A appendable, Object[] parts)
用來存在放通過解析預先配置的分隔符後與Object[]型別parts解析後的字串
 
A <A extends Appendable> appendTo(A appendable, Object first, Object second, Object... rest)
用來存在放通過解析預先配置的分隔符後與Object...型別parts解析後的字串
 
StringBuilder appendTo(StringBuilder builder, Iterable<?> parts)
用來存在放通過解析預先配置的分隔符後與Iterable型別parts解析後的字串
 
StringBuilder appendTo(StringBuilder builder, Iterator<?> parts)
用來存在放通過解析預先配置的分隔符後與Iterator型別parts解析後的字串
 
StringBuilder appendTo(StringBuilder builder, Object[] parts)
用來存在放通過解析預先配置的分隔符後與Object[]型別parts解析後的字串
 
StringBuilder appendTo(StringBuilder builder, Object first, Object second, Object... rest)
用來存在放通過解析預先配置的分隔符後與Object...型別parts解析後的字串
 
String	join(Iterable<?> parts)
返回一個String在Iterable<?> parts每個資料中間新增上基於之前配置的分隔符
 
String	join(Iterator<?> parts)
返回一個String在Iterator<?> parts每個資料中間新增上基於之前配置的分隔符
 
String	join(Object[] parts)
返回一個String在Object[] parts每個資料中間新增上基於之前配置的分隔符
 
String	join(Object first, Object second, Object... rest)
返回一個String在Object... parts每個資料中間新增上基於之前配置的分隔符
 
static Joiner on(char separator)
返回一個Joiner物件用來自己替換在連線的元素中char型別分隔符
 
static Joiner on(String separator)
返回一個Joiner物件用來自己替換在連線的元素中String型別分隔符
 
Joiner	skipNulls()
返回一個Joiner物件但是會跳過連線元素中為null的元素
 
Joiner	useForNull(String nullText)
返回一個Joiner物件但是會把為null的元素替換為String型別的nullText
 
Joiner.MapJoiner withKeyValueSeparator(String keyValueSeparator)
返回一個MapJoiner物件,用於新增到間隔Map中的Entity(而on()方法是替換key與value之間)。
是Splitter.withKeyValueSeparator()的逆運算。


首先我們來看看下面我們經常遇見的一個案例:

題目:
對於一個如下定義List

   List<String> list = new ArrayList<String>("1", "2", null, “3”);

按照’,’分割,並過濾掉null。

 如果不用第三方庫,如common-lange,Guava,用原生java,我們將怎麼繼續?

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版本呢?

public static String joinByGuava(List stringList, String delimiter) {

      return    Joiner
                 .on(delimiter)
                 .skipNulls()
                 .join(stringList);
  }

我們不在考慮更多的細節,並且很有語義的告訴程式碼的閱讀者,用什麼分隔符,需要過濾null值再join。

 

Splitter


去除分隔結果為空格的資料,使用omitEmptyStrings

public static void main(String[] args) {
        String str = "a,b,     c,,d";
        Iterable<String> result = Splitter.on(',')//設定分隔符
                .omitEmptyStrings() //用於去除為空格的分割結果
                .split(str); //要分割的字串
        System.out.println("--start--");
        for (String s : result) {
            System.out.println(s);
        }
        System.out.println("--end--");
    }


去除分隔結果的前後空格,trimResults()

public static void main(String[] args) {
        String str = "a, b ,     c,,d";
        Iterable<String> result = Splitter.on(',')//設定分隔符
                .trimResults() //去除前後空格
                .omitEmptyStrings() //用於去除為空格的分割結果
                .split(str); //要分割的字串
        System.out.println("--start--");
        for (String s : result) {
            System.out.println(s);
        }
        System.out.println("--end--");
    }


使用Splitter方法把string轉換為list

public void createListFromString() {
    String input = "apple - banana - orange";
    List<String> result = Splitter.on("-")
                          .trimResults()
                          .splitToList(input);
    for (String string : result) {
        System.out.println(string);
    }
}


其他方法:
trimResults(CharMatcher) 給定匹配器,移除結果字串的匹配字元 
limit(int) 限制拆分出的字串數量
 

MapJoinner和MapSplitter

對於MapJoinner和MapSplitter的最好案例就是url的param編碼。

MapJoinner

題目:
生產一個查詢(id: 123,name: green)的學生資訊的url。

利用Guava的MapJoinner的程式碼如下:

Joiner.on("&").withKeyValueSeparator("=").join(ImmutableMap.of("id", "123", "name", "green"));


這裡採用了on傳入map item之間分隔符,以及withKeyValueSeparator傳遞map項key/value之間的分隔符。所以能夠很簡單的實現,不用我們在去實現一個的for迴圈程式碼。


利用Guava的MapSplitter的程式碼如下:

final Map<String, String> join = Splitter.on("&").withKeyValueSeparator("=").split("id=123&name=green");

這裡同樣利用on傳入字串的第一分隔符,withKeyValueSeparator傳入項的分隔符,產生map的key/value項,其結果是一個{id=123, name=green}的Map物件。
 

相關文章