我要求Joiner能够使用前缀和后缀元素。
例如
String str[] = {"a", "b", "c"};
Joiner.on(",").prefix("'").suffix("'").join(str);
预期输出为:
'a','b','c'
我们有替代方案吗?因为番石榴不这样做(或者我不知道)。使用java 8有更好的选择吗?
答案 0 :(得分:9)
更有效的解决方案是
String str[] = {"a", "b", "c"}; // or whatever
if (str.length == 0 ) {
return "";
}
return "'" + Joiner.on("','").join(str) + "'";
也比使用函数短(至少没有函数文字;处理空输入会使这个解决方案变得丑陋)。不好的部分是你必须以一种不太明显的方式在Joiner
中包含前缀和后缀并重复它们。这个例子使它更加明显:
return "[" + Joiner.on("], [").join(str) + "]";
为了在不考虑的情况下做到正确,只需记住["+", "+"]
的内容,即[+], [+]
并使用加号分隔的部分。
答案 1 :(得分: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(","));