Aktualisierte Version mit Java 8 (Original am Ende des Beitrags)
Wenn Sie keine Elemente filtern müssen, können Sie diese verwenden
Seit Java 8 können wir unseren Code verwenden StringJoiner(anstatt ursprünglich verwendet StringBulder) und vereinfachen.
Um zu vermeiden, dass " *"Regex bei jedem Aufruf von neu kompiliert wird, matches(" *")können wir ein separates Muster erstellen, das die kompilierte Version in einem bestimmten Feld enthält und bei Bedarf verwendet.
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();
}
Bei Streams kann unser Code so aussehen.
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));
}
Wenn wir Streams verwenden, können wir filterElemente, die Predicate. In diesem Fall möchten wir, dass das Prädikat Zeichenfolgen akzeptiert, die nicht nur Leerzeichen sind. Mit anderen Worten, Zeichenfolgen müssen Nicht-Leerzeichen enthalten.
Wir können ein solches Prädikat aus dem Muster erstellen. Prädikats erstellt diese Art und Weise werden alle Strings akzeptieren , die Zeichenkette enthalten wird , die durch regex abgestimmt werden (also wenn regex für aussehen "\\S"Prädikat wird Strings wie akzeptieren "foo ", " foo bar ", "whatever", aber nicht akzeptieren " "noch " ").
Also können wir verwenden
Pattern.compile("\\S").asPredicate();
oder möglicherweise etwas aussagekräftiger, Negation von Zeichenfolgen, die nur Leerzeichen oder leer sind
Pattern.compile("^\\s*$").asPredicate().negate();
Wenn der Filter alle leeren oder nur Leerzeichen enthaltenden Zeichenfolgen entfernt, können wir die collectrestlichen Elemente entfernen . Dank Collectors.joiningkönnen wir entscheiden, welches Trennzeichen verwendet werden soll.
Ursprüngliche Antwort (vor 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();
}
Sie können es wie verwenden
System.out.println(implode(", ", "ab", " ", "abs"));
oder
System.out.println(implode(", ", new String[] { "ab", " ", "abs" }));
Ausgabe ab, abs