我看到了这篇回答中介绍的如何将String[]连接为逗号分隔字符串的方法。
但是,我需要一个工具,仅在数组中的值不为空时才连接字符串。
有没有最好的方法?而且不需要先循环遍历String[]来删除空值。我希望有一个方法可以同时处理。
编辑
例如:
I, love, , u
将会是:
I love u
在Java 8中,您可以使用Stream:
List<String> list = Arrays.asList("I", " ", "love", null, "you");
String message = list.stream().filter(StringUtils::isNotBlank)
.collect(Collectors.joining(", "));
System.out.println("message = " + message);
Stream.of(T... values)
创建流。 - mlemler@RequiresApi(api = Build.VERSION_CODES.N)
。 - Pratik Butani对于Java 8,可以使用流API来解决。过滤null和空字符串,并在每个字符串之间用空格连接。
String joined = Stream.of(I, love, , u)
.filter(s -> s != null && !s.isEmpty())
.collect(Collectors.joining(" "));
如果只是为了null值跳过,Guava是最好的选择:
Joiner.on(" ").skipNulls().join("I", null, "love", null, "u")
一种纯Java 11的解决方案是:
String message = Stream.of("I", null, "Love", " ", "You")
.filter(Objects::nonNull)
.filter(Predicate.not(String::isBlank))
.collect(Collectors.joining(" "));
System.out.println(message);
我爱你
如果你真的需要使用数组 - 那么代替 Stream.of()
,你可以这样做:
Arrays.stream(new String[] { "I", null, "Love", " ", "You" })
检查 null/empty 是否有问题?
String[] values = ?;
if (values != null && values.length > 0) {
// join
}
你指向的答案已经使用StringUtils.join进行了连接。
虽然你的要求与此不太相符,但它非常简单,因此最好实现自己的连接循环,例如:
StringBuilder sb = new StringBuilder();
boolean first = true;
for (String word: words) {
if (word != null && (word = word.trim()).length() > 0) {
if (first) {
first = false;
} else {
sb.append(',');
}
sb.append(word);
}
}
没有任何API或库的情况下,我们可以按照以下方式连接非空、非空字符串数组:
用户定义的方法:
public String joinNonBlankStringArray(String s[], String separator) {
StringBuilder sb = new StringBuilder();
if (s != null && s.length > 0) {
for (String w : s) {
if (w != null && !w.trim().isEmpty()) {
sb.append(w);
sb.append(separator);
}
}
}
return sb.substring(0, sb.length() - 1);// length() - 1 to cut-down last extra separator
}
String s[] = {" ","abc", "", "XYZ", " ", null, "123", null};
String joinVal = joinNonBlankStringArray(s, ",");// "abc,XYZ,123"
public class So20111214a {
public static String join(String[] argStrings) {
if (argStrings == null) {
return "";
}
String ret = "";
if (argStrings.length > 0) {
ret = argStrings[0];
} // if
for (int i = 1; i<argStrings.length; i++) {
ret += (argStrings[i] == null)
? ""
: (argStrings[i].isEmpty()
? ""
: ( "," + argStrings[i] ) );
} // for
return ret;
} // join() method
public static void main(String[] args) {
String[] grandmasters = {
"Emanuel Lasker",
"José Raúl Capablanca",
"Alexander Alekhine",
"Siegbert Tarrasch",
"Frank Marshall"
};
String[] s1 = null;
String[] s2 = {};
String[] s3 = { "Mikhail Botvinnik" };
System.out.println(join(s1));
System.out.println(join(s2));
System.out.println(join(s3));
System.out.println(join(grandmasters));
System.out.println(join(new String[]{"I", "love", "", null, "u!"}));
} // main() method
/* output:
<empty string>
<empty string>
Mikhail Botvinnik
Emanuel Lasker,José Raúl Capablanca,Alexander Alekhine,Siegbert Tarrasch,Frank Marshall
I,love,u!
*/
} // So20111214a class
PS:抱歉使用了问号运算符 - 我必须快速完成,我正在工作中。:)
Jakarta StringUtils可以实现这一点。 以下是来自那里的代码:
public static String join(Object[] array, String separator) {
if (array == null) {
return null;
}
return join(array, separator, 0, array.length);
}
if (givenStringArray.length > 0) { ... }
子句,对吧? - codeling