Guava Joiner无法使用前缀和后缀

Moh*_*nan 6 java google-api guava

我在Joiner中要求能够使用前缀和后缀元素.

例如

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

预期产出将是:

'a','b','c'
Run Code Online (Sandbox Code Playgroud)

我们有替代方案吗?因为番石榴不这样做(或者我不知道).使用java 8有更好的选择吗?

maa*_*nus 9

更有效的解决方案是

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

这也比使用函数更短(至少没有函数文字;处理空输入会使这个解决方案变得丑陋).不好的部分是你必须以Joiner一种不太明显的方式包含前缀和后缀并重复它们.这个例子使它更加明显:

return "[" + Joiner.on("], [").join(str) + "]";
Run Code Online (Sandbox Code Playgroud)

为了在不考虑的情况下做到正确,只需记住出来的内容["+", "+"],即[+], [+]使用加号分离的部分.

  • 这个approch会运行良好,除非你有空数组加入.所以我们可能需要处理如果数组为空则不要加入它们.我刚补充说,如果检查. (2认同)

Cht*_*ect 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));
Run Code Online (Sandbox Code Playgroud)

转型如下:

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

有人可能会说这是一种冗长的方式,但我很欣赏transform范式所提供的灵活性.

编辑(因为现在有Java 8)

在Java 8中,所有这些都可以使用Stream接口在一行中完成,如下所示:

strList.stream().map(s -> "'" + s + "'").collect(Collectors.joining(","));
Run Code Online (Sandbox Code Playgroud)