Оновлена версія за допомогою Java 8 (оригінал в кінці допису)
Якщо вам не потрібно фільтрувати будь-які елементи, які ви можете використовувати
З Java 8 ми можемо використовувати StringJoiner(замість спочатку використовуваного StringBulder) та спростити наш код.
Також, щоб уникнути перекомпіляції " *"регулярного виразу в кожному виклику, matches(" *")ми можемо створити окремий Шаблон, який буде містити свою скомпільовану версію в якомусь полі та використовувати її за потреби.
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. У цьому випадку ми хочемо, щоб предикат приймав рядки, які є не лише пробілами - іншими словами, рядок повинен містити непробільний символ.
Ми можемо створити такий предикат із шаблону. Створений таким чином предикат буде приймати будь-які рядки, які будуть містити підрядок, якому може відповідати регулярний вираз (тому, якщо регулярний вираз буде шукати"\\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++) {
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