我需要在Joiner中实现元素前缀和后缀的功能。
例如:
String str[] = {"a", "b", "c"};
Joiner.on(",").prefix("'").suffix("'").join(str);
预期输出应该是:
'a','b','c'
这个有其他的替代方案吗?因为Guava好像没有这个功能(或者我不知道有没有)。在Java 8中,有更好的替代方案吗?
我需要在Joiner中实现元素前缀和后缀的功能。
例如:
String str[] = {"a", "b", "c"};
Joiner.on(",").prefix("'").suffix("'").join(str);
'a','b','c'
这个有其他的替代方案吗?因为Guava好像没有这个功能(或者我不知道有没有)。在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 + "'";
}
};
有人可能会说这是一个冗长的做法,但我钦佩“转换”范式所提供的灵活性。
编辑(因为现在有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比使用函数更短(至少没有函数文字;处理空输入使此解决方案变得丑陋)。不好的是,你必须以不太明显的方式包含前缀和后缀在Joiner
中并重复它们。这个例子更加明显:
return "[" + Joiner.on("], [").join(str) + "]";
["+", "+"]
的结果是[+], [+]
,并使用这个用加号分隔的组件。
Arrays.stream(str_array)
而无需首先将其转换为列表。其余的map
和collect
步骤保持不变。 - Chthonic Project