如果不为空或不为 null,则使用逗号连接

27

我看到了这篇回答中介绍的如何将String[]连接为逗号分隔字符串的方法。

但是,我需要一个工具,仅在数组中的值不为空时才连接字符串。

有没有最好的方法?而且不需要先循环遍历String[]来删除空值。我希望有一个方法可以同时处理。

编辑

例如:

I, love, , u

将会是:

 I love u

你是指不用循环怎么做吗?还是说不让自己写循环? - LuckyLuke
任何你选择的第三方实用程序在内部都会使用循环。 - jmj
你尝试过链接问题中提到的StringUtils.join吗?它应该也能处理空数组的情况...如果不能,你总可以在它周围建立一个if (givenStringArray.length > 0) { ... }子句,对吧? - codeling
你是否在使用一维数组? - Christopher Pelayo
我指的是内部值,而不是字符串本身。 - Dejell
9个回答

52

在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);

20
可以使用Stream.of(T... values)创建流。 - mlemler
对于Android,它需要 @RequiresApi(api = Build.VERSION_CODES.N) - Pratik Butani

9

对于Java 8,可以使用流API来解决。过滤null和空字符串,并在每个字符串之间用空格连接。

String joined = Stream.of(I, love, , u)
      .filter(s -> s != null && !s.isEmpty())
      .collect(Collectors.joining(" "));

2
虽然这可能回答了作者的问题,但它缺少一些解释性的词语和/或文档链接。裸代码片段没有周围的一些短语是不太有用的。您也可以在如何撰写好的答案中找到很多帮助。请[编辑]您的答案 - 来自审查 - Nick
1
当Brian Goetz给出相同的答案时,没有人关心解释文字。 - user2104560

5

如果只是为了null值跳过,Guava是最好的选择:

Joiner.on(" ").skipNulls().join("I", null, "love", null, "u")

Joiner类的包是什么? - Shakirov Ramil
这是来自Guava库的内容。 - Grigory Kislin

5

一种纯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" })

3

检查 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);
        }
    }

我知道这个,但想看看是否已经有人写过了。 - Dejell

2
为什么不直接循环数组,并使用StringBuilder仅为非空值构建逗号分隔字符串。

1

没有任何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"

1
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:抱歉使用了问号运算符 - 我必须快速完成,我正在工作中。:)


1
只要数组的第一个元素不为null或空,这个方法就能很好地工作。然而,通过循环遍历元素来确定第一个非null/空元素并根据该索引设置第二个循环的初始索引也是很容易的。 - Larry Hector

-3

Jakarta StringUtils可以实现这一点。 以下是来自那里的代码:

public static String join(Object[] array, String separator) {
    if (array == null) {
        return null;
    }
    return join(array, separator, 0, array.length);
}

3
它检查字符串是否为null,但不检查字符串数组的值是否为空或null。 - Dejell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接