使用 Java 8 的更新版本(原始在帖子末尾)
如果您不需要过滤任何可以使用的元素
从 Java 8 开始,我们可以使用StringJoiner
(而不是最初使用的StringBulder
)并简化我们的代码。
此外,为了避免" *"
在每次调用中重新编译正则表达式,matches(" *")
我们可以创建单独的 Pattern,它将在某些字段中保存其编译版本并在需要时使用它。
private static final Pattern SPACES_OR_EMPTY = Pattern.compile(" *");
public static String implode(String separator, String... data) {
StringJoiner sb = new StringJoiner(separator);
for (String token : data) {
if (!SPACES_OR_EMPTY.matcher(token).matches()) {
sb.add(token);
}
}
return sb.toString();
}
使用流,我们的代码可以看起来像。
private static final Predicate<String> IS_NOT_SPACES_ONLY =
Pattern.compile("^\\s*$").asPredicate().negate();
public static String implode(String delimiter, String... data) {
return Arrays.stream(data)
.filter(IS_NOT_SPACES_ONLY)
.collect(Collectors.joining(delimiter));
}
如果我们使用流,我们可以filter
元素 which Predicate
。在这种情况下,我们希望谓词接受不仅是空格的字符串 - 换句话说,字符串必须包含非空白字符。
我们可以从 Pattern 中创建这样的 Predicate。以这种方式创建的谓词将接受任何包含正则表达式可以匹配的子字符串的字符串(因此,如果正则表达式将查找"\\S"
谓词,则将接受像"foo "
, " foo bar "
,之类的字符串"whatever"
,但不接受" "
也不接受" "
)。
所以我们可以使用
Pattern.compile("\\S").asPredicate();
或者可能更具描述性,否定只有空格或空的字符串
Pattern.compile("^\\s*$").asPredicate().negate();
接下来,当过滤器将删除所有空的或仅包含空格的字符串时,我们可以collect
其余元素。感谢Collectors.joining
我们可以决定使用哪个分隔符。
原始答案(Java 8 之前)
public static String implode(String separator, String... data) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < data.length - 1; i++) {
//data.length - 1 => to not add separator at the end
if (!data[i].matches(" *")) {//empty string are ""; " "; " "; and so on
sb.append(data[i]);
sb.append(separator);
}
}
sb.append(data[data.length - 1].trim());
return sb.toString();
}
你可以像这样使用它
System.out.println(implode(", ", "ab", " ", "abs"));
或者
System.out.println(implode(", ", new String[] { "ab", " ", "abs" }));
输出ab, abs