guava翻譯系列之Joiner

normanli發表於2017-02-27

基本的guava工具

在前面的章節,我們已經討論了什麼是GUAVA和怎樣去安裝GUAVA,在這一章我們將開始使用guava,我們將展示guava提供的基本功能,並且瞭解一下這些基本功能是怎樣幫助我們簡化日常工作遇到的的問題
在這一章節中,我們將覆蓋一下幾個方面的內容:

  • 使用Joiner Class 將字串以指定的分隔符連線起來。 我們也會涉及到使用MapJoiner
  • Splitter Class,和Joiner的作用相反,將一個字串以給定的分隔符分隔開
  • 使用CharMatcher 和 Strings 類 完成一些基本的操作,比如 將String中的一部分移出,匹配String中的某一部分等等
  • Preconditions Class 提供了一些方法去判斷引數,方法,變數是否和你的預期一樣
  • 可以和任何一個java物件協作的一些基本的工具類,還有以比較方便的方式實現 Comparable 介面

使用Joiner 類

將一些普通的字串以固定的分隔符組裝在一起是我們在平常工作遇到的,比如將一個Array,List,iterable包含的內容組轉成字串,最常見的就是使用迴圈將字串拼接在StringBuilder上,一般的程式碼如下:

這段程式碼要注意的就是要將最後一個分隔符去掉。這段程式碼不是很複雜,但是沒有什麼價值,完全可以使用Joiner類實現。 下面是一個簡單的例子,使用Joiner類以 “|” 將字串分隔:
Joiner.on(“|”).skipNulls().join(StringList);
這段程式碼以簡潔明明瞭的方式實現字串分隔的功能,降低了程式碼出錯的概率。 如果你需要將List中的null值以一個特殊的值代替,那麼可以用下面的程式碼實現:
Joiner.on(“|”).userForNull(“no value”).join(stringList).

關於Joiner有如下幾點我們需要強調:

  • Joiner Class不僅僅和String[]一起工作,還可以和array iterable,以及陣列物件,Joiner返回是迴圈Object.toString()方法。
  • 如果沒有使用skipNulls或者userForNull 那麼出現Null時,會出現NullPointException
  • Joiner Class是一個不變類,就像String一樣
    `Joiner stringJoiner = Joiner.on(“|”).skipNulls();

//the useForNull() method returns a new instance
of the Joiner!
stringJoiner.useForNull(“missing”);
stringJoiner.join(“foo”,”bar”,null);`
在這個例子中,useForNull這個方法返回了一個新的Joiner物件,對原來的stringJoiner沒有任何影響,因此當執行這個例子的時候,最後一個null物件還是會被忽略,不會變成 missing.

  • Joiner 類不僅僅會返回Strings,而且還能返回StringBuilder
    `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”)`
在這個例子中,我們傳遞了個一個StringBuilder的例項給Joiner Class,joiner.appedTo 會將 foo,bar,baz 以 “|”分隔,並將值給stringBuilder.

  • Joiner 類可以和實現了Appendable的例項合作
    `FileWriter fileWriter = new FileWriter(new File(“path”)):

List dateList = getDates();
Joiner joiner = Joiner.on(“#”).useForNulls(” “);
//returns the FileWriter instance with the values
appended into it
joiner.appendTo(fileWriter,dateList);`
這裡我們看到了一個和上面類似的例子,我們傳遞一個FileWriter的例項和一個包含了Date的list給Joiner 類,Joiner 類會將包含日期的list追加到FileWriter例項上。

從上面的例子中我們可以看到,Joiner類在處理一些基本任務是非常容易的,並且非常容易的。 在我們將目光離開Joiner類之前,我們來看一個特殊的類 MapJoiner,MapJoiner的使用方式和Joiner差不多,但是有一點不同的是: 他是將key/value以特地的分隔符分隔,建立一個MapJoiner類可以採用如下方式:
mapJoiner = Joiner.on("#").withKeyValueSeparator("=");
讓我們快速的看一下這段程式碼做了什麼事:

  • Joiner.on(“#”) 建立了一個Joiner 物件
  • withKeyValueSeparator方法建立了一個MapJoiner物件

下面是一個例子展示MapJoiner的使用:
`@Test
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 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));
}`

回顧一下Joiner類的使用

前面的單元測試的例子中,我們使用Maps的一個靜態工廠類的newLinkedHashMap方法建立了一個LinkedHashMap. 這個方法可以在com.google.common.collect包中找到。 Joiner 類將map中的每個物件以”#”分隔. withKeyValueSeparator 返回MapJoiner類,將map裡面的key/value物件以”=”分隔。 最後我們使用Assert進行斷言。


相關文章