Phiên bản cập nhật sử dụng Java 8 (bản gốc ở cuối bài đăng)
Nếu bạn không cần lọc bất kỳ phần tử nào, bạn có thể sử dụng
Kể từ Java 8, chúng tôi có thể sử dụng StringJoiner
(thay vì sử dụng ban đầu StringBulder
) và đơn giản hóa mã của chúng tôi.
Ngoài ra, để tránh biên dịch lại " *"
regex trong mỗi lần gọi, matches(" *")
chúng ta có thể tạo Mẫu riêng biệt sẽ giữ phiên bản đã biên dịch của nó trong một số trường và sử dụng nó khi cần thiết.
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();
}
Với các luồng, mã của chúng tôi có thể trông như thế nào.
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));
}
Nếu chúng tôi sử dụng các luồng, chúng tôi có thể filter
yếu tố đó Predicate
. Trong trường hợp này, chúng ta muốn vị từ chấp nhận các chuỗi không chỉ là khoảng trắng - nói cách khác chuỗi phải chứa ký tự không phải khoảng trắng.
Chúng ta có thể tạo Predicate như vậy từ Pattern. Vị ngữ tạo ra theo cách này sẽ chấp nhận bất kỳ chuỗi đó sẽ chứa chuỗi có thể được kết hợp bởi regex (vì vậy nếu regex sẽ tìm kiếm "\\S"
vị sẽ chấp nhận chuỗi như "foo "
, " foo bar "
, "whatever"
, nhưng sẽ không chấp nhận " "
và cũng không " "
).
Vì vậy, chúng ta có thể sử dụng
Pattern.compile("\\S").asPredicate();
hoặc có thể mô tả nhiều hơn một chút, phủ định của các chuỗi chỉ là khoảng trắng hoặc trống
Pattern.compile("^\\s*$").asPredicate().negate();
Tiếp theo khi bộ lọc sẽ loại bỏ tất cả các chuỗi trống hoặc chỉ chứa khoảng trắng Các chuỗi chúng ta có thể collect
còn lại các phần tử. Nhờ Collectors.joining
chúng tôi có thể quyết định sử dụng dấu phân cách nào.
Câu trả lời gốc (trước 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();
}
Bạn có thể sử dụng nó như
System.out.println(implode(", ", "ab", " ", "abs"));
hoặc là
System.out.println(implode(", ", new String[] { "ab", " ", "abs" }));
Đầu ra ab, abs