使用Java 8的更新版本(发布后的原始版本)
如果您不需要过滤任何元素,则可以使用
从Java 8开始,我们可以使用StringJoiner(而不是最初使用StringBulder)并简化我们的代码。
另外,为了避免" *"在每次调用中重新编译正则表达式,matches(" *")我们可以创建单独的Pattern,该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包含哪些元素Predicate。在这种情况下,我们希望谓词接受不仅是空格的字符串-换句话说,字符串必须包含非空白字符。
我们可以从Pattern中创建这样的谓词。谓词创建这样将接受其中将包含子这可以通过正则表达式匹配任何字符串(所以,如果正则表达式将寻找"\\S"谓词会接受像琴弦"foo "," foo bar ","whatever",但不会接受" "也不是" ")。
所以我们可以使用
Pattern.compile("\\S").asPredicate();
或更具描述性,否定字符串(只能为空格或为空)
Pattern.compile("^\\s*$").asPredicate().negate();
接下来,当filter将删除所有空的或仅包含空格的字符串时,我们可以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++) {
if (!data[i].matches(" *")) {
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