2014-01-06 39 views
4

我有要求Joiner有前綴和後綴元素的能力。Guava Joiner不具備前綴和後綴的能力

例如

String str[] = {"a", "b", "c"}; 
Joiner.on(",").prefix("'").suffix("'").join(str); 

預計產出將是:

'a','b','c' 

我們是否有這方面的任何替代方案?由於番石榴不這樣做(或我不知道)。用java 8有更好的選擇嗎?

回答

6

您可以使用Guava的List#transform進行轉換a --> 'a',然後在轉換的列表上使用Joinertransform只適用於Iterable對象,但不適用於陣列。該代碼將仍然有足夠的簡潔:

List<String> strList = Lists.newArraylist(str); // where str is your String[] 
Joiner.on(',').join(Lists.transform(str, surroundWithSingleQuotes)); 

其中轉換如下:

Function<String, String> surroundWithSingleQuotes = new Function<String, String>() { 
    public String apply(String string) { 
     return "'" + string + "'"; 
    } 
}; 

有人可能會說,這是這樣做的長篇大論方式,但我很佩服的柔性量由transform範式提供。

編輯(因爲現在的Java 8)

在Java 8,這一切都可以在使用Stream接口一行來完成,如下所示:

strList.stream().map(s -> "'" + s + "'").collect(Collectors.joining(",")); 
+1

我喜歡。被接受的答案會分崩離析,因爲它不是真正的裝飾者;例如,如果您想要根據某些條件使用不同的周圍字符串,則transform()方法會更直接地接受此答案 –

+0

。 –

+1

@MohdAdnan:如果你用一個數組而不是一個列表開始,你可以直接使用Arrays.stream(str_array)而不是先將它轉換成列表。剩下的「地圖」和「收集」步驟保持不變。 –

7

一種更有效的解決方案是

String str[] = {"a", "b", "c"}; // or whatever 
if (str.length == 0) { 
    return ""; 
} 
return "'" + Joiner.on("','").join(str) + "'"; 

它比使用函數還短(至少沒有函數文字;處理一個空輸入使得這個解決方案變得醜陋)。不好的部分是你必須以不明顯的方式在Joiner中包含前綴和後綴並重復它們。這個例子使它更加明顯:

return "[" + Joiner.on("], [").join(str) + "]"; 

得到它的權利,而不思考,只記得什麼出來了["+", "+"],即[+], [+]使用加分部分。

+2

除非你有空數組加入,否則這種做法將行之有效。所以可能我們需要處理,如果數組是空的不加入他們。我只是補充說,如果檢查。 –