guava翻譯系列之Splitter

normanli發表於2017-02-27

使用Splitter類

另一個常見的操作就是解析一個以固定分隔符分隔的字串,並返回一個包含這個String的陣列,如果你需要去閱讀一個text檔案,你會經常要處理這種情況。但是String.split方法還有一些可以改進的地方,就像下面的例子所展示的:
`String testString = “Monday,Tuesday,,Thursday,Friday,,”;
//parts is [Monday, Tuesday, , Thursday,Friday]
String[] parts = testString.split(“,”);`
從上面的例子中你可以看到String.split方法預設將最後連個空的字串去除了,在有些情況下你是希望這麼做的。但是這樣並不是特別好,這樣的選擇應該留給程式設計師去處理。Splitter類可以協助去處理這樣的情況。 Splitter 類的作用剛好和Joiner相反,Spliter 類可以使用在 字元,固定的字串,正規表示式,CharMatcher類(下面我們會介紹這個類). 通過呼叫Splitter類的on方法,可以獲取Splitter例項,一旦建立了Splitter類,就可以呼叫split方法,spliter方法會返回一個包含了結果的可迭代物件.

`Splitter.on(`|`).split(“foo|bar|baz”);
Splitter splitter = Splitter.on(“d+”);`

  • 上面的例子,我們看到一個Splitter例項使用`|`分隔,另外一個splitter使用了一個正規表示式
  • Splitter 類還有一個選項可以將字串中的空白字元去除。 效果就想String.split。只要使用 trimResults()
    `//Splits on `|` and removes any leading or trailing whitespace

Splitter splitter = Splitter.on(`|`).trimResults();`

  • 就像Joiner類一樣,Splitter類是一個不可變類。所以千萬不要單獨的去呼叫trimResults方法,這樣並不能在原始的splitter類上起作用。 就像下面的這個例子:
    `Splitter splitter = Splitter.on(`|`);

//Next call returns a new instance, does not
modify the original!
splitter.trimResults();
//Result would still contain empty elements
Iterable parts = splitter.split(“1|2|3|||”);`

  • Joiner類有一個與之對應的MapJoiner,Splitter類也有一個MapSplitter類。MapSplitter的作用剛好和MapJoiner類的作用相反,具體的可以看一下下面的例子:
    `//MapSplitter is defined as an inner class of Splitter

Splitter.MapSplitter mapSplitter = Splitter.on(“#”).
withKeyValueSeparator(“=”);`
就像我們所看到的一樣,MapSplitter的建立和MapJoiner類一樣,先建立一個Splitter類,然後通過一個指定一個特定的分隔符得到一個MapSplitter物件。
`@Test
public void testSplitter() {
String startString = “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”);
Splitter.MapSplitter mapSplitter =
Splitter.on(“#”).withKeyValueSeparator(“=”);
Map splitMap =
mapSplitter.split(startSring);
assertThat(testMap,is(splitMap));
}`

Splitter類使用回顧

上面的單元測試類,使用一個String物件,並且使用MapSplitter類建立一個LinkedHashMap例項。
這裡我們覆蓋了Joiner類和Splitter類的使用,這兩個類應該要放到開發人員的工具箱中。


相關文章