我有要求Joiner有前綴和後綴元素的能力。Guava Joiner不具備前綴和後綴的能力
例如
String str[] = {"a", "b", "c"};
Joiner.on(",").prefix("'").suffix("'").join(str);
預計產出將是:
'a','b','c'
我們是否有這方面的任何替代方案?由於番石榴不這樣做(或我不知道)。用java 8有更好的選擇嗎?
我有要求Joiner有前綴和後綴元素的能力。Guava Joiner不具備前綴和後綴的能力
例如
String str[] = {"a", "b", "c"};
Joiner.on(",").prefix("'").suffix("'").join(str);
預計產出將是:
'a','b','c'
我們是否有這方面的任何替代方案?由於番石榴不這樣做(或我不知道)。用java 8有更好的選擇嗎?
您可以使用Guava的List#transform
進行轉換a --> 'a'
,然後在轉換的列表上使用Joiner
。 transform
只適用於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(","));
一種更有效的解決方案是
String str[] = {"a", "b", "c"}; // or whatever
if (str.length == 0) {
return "";
}
return "'" + Joiner.on("','").join(str) + "'";
它比使用函數還短(至少沒有函數文字;處理一個空輸入使得這個解決方案變得醜陋)。不好的部分是你必須以不明顯的方式在Joiner
中包含前綴和後綴並重復它們。這個例子使它更加明顯:
return "[" + Joiner.on("], [").join(str) + "]";
得到它的權利,而不思考,只記得什麼出來了["+", "+"]
,即[+], [+]
使用加分部分。
除非你有空數組加入,否則這種做法將行之有效。所以可能我們需要處理,如果數組是空的不加入他們。我只是補充說,如果檢查。 –
我喜歡。被接受的答案會分崩離析,因爲它不是真正的裝飾者;例如,如果您想要根據某些條件使用不同的周圍字符串,則transform()方法會更直接地接受此答案 –
。 –
@MohdAdnan:如果你用一個數組而不是一個列表開始,你可以直接使用Arrays.stream(str_array)而不是先將它轉換成列表。剩下的「地圖」和「收集」步驟保持不變。 –