Guava Joiner没有前缀和后缀功能。

6

我需要在Joiner中实现元素前缀和后缀的功能。

例如:

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

预期输出应该是:
'a','b','c'

这个有其他的替代方案吗?因为Guava好像没有这个功能(或者我不知道有没有)。在Java 8中,有更好的替代方案吗?

2个回答

10

您可以使用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 + "'";
    }
};

有人可能会说这是一个冗长的做法,但我钦佩“转换”范式所提供的灵活性。

编辑(因为现在有Java 8)

在Java 8中,可以使用Stream接口,在一行代码中完成所有操作,如下所示:

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

1
我喜欢它。被接受的答案不够完整,因为它不是一个真正的装饰器;例如,如果您想根据某些条件使用不同的前后缀字符串,则使用transform()方法会更直接。 - Dexter Legaspi
accepting this answer. - Mohammad Adnan
1
@MohdAdnan:如果你使用的是数组而不是列表,你可以直接使用 Arrays.stream(str_array) 而无需首先将其转换为列表。其余的mapcollect步骤保持不变。 - Chthonic Project

9
一种更有效的解决方案是:
String str[] = {"a", "b", "c"}; // or whatever
if (str.length == 0 ) {
    return "";
}
return "'" + Joiner.on("','").join(str) + "'";

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

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

为了让您轻松理解,只需记住["+", "+"]的结果是[+], [+],并使用这个用加号分隔的组件。

2
这种方法很好,除非你有一个空数组要连接。所以我们可能需要处理如果数组为空就不要连接它们。我刚刚添加了那个if检查。 - Mohammad Adnan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接