在Java中连接空字符串的正确方法是什么?

syn*_*gma 33 java string concat

我知道以下内容:

String s = null;
System.out.println("s: " + s);
Run Code Online (Sandbox Code Playgroud)

将输出:s: null.

我如何才能输出s: ?

在我而言,这是重要的,因为我有来连接String4个s1, s2, s3, s4,其中每个值可能会或可能不会具有null价值.

我问这个问题,因为我不想要检查的S1到S4的每一个组合 (即检查是否这些变量null)或更换"null"empty String在最后,我想可能有一些更好的方式来做到这一点.

Ste*_*n C 41

最简洁的解决方案是:

System.out.println("s: " + (s == null ? "" : s));
Run Code Online (Sandbox Code Playgroud)

或者也许创建或使用静态帮助方法来做同样的事情; 例如

System.out.println("s: " + denull(s));
Run Code Online (Sandbox Code Playgroud)

但是,这个问题具有过度使用/滥用的应用程序的"气味" null.null如果它具有与非空值的含义不同(并且需要不同)的特定含义,则最好仅使用/返回a .

例如:

  • 如果这些空值来自已默认初始化为的String属性null,请考虑显式初始化它们"".
  • 不要null用来表示空数组或集合.
  • 什么null时候抛出异常会更好.
  • 考虑使用Null对象模式.

现在显然所有这些都有反例,有时你必须处理一个预先存在的API,无论出于什么原因,它都会给你空值.但是,根据我的经验,最好避免使用null......大部分时间.

因此,在您的情况下,更好的方法可能是:

String s = "";  /* instead of null */
System.out.println("s: " + s);
Run Code Online (Sandbox Code Playgroud)

  • `java.util.Objects.toString(obj,default)`是`denull()`的库的等价物.关于空值的总体建议是好的.+1. (11认同)
  • @StuartMarks - 它与`denull`的作用相同.但是一种特殊用途的辅助方法会更简洁. (2认同)

ski*_*iwi 25

您可以在Java 8中使用以下内容:

String s1 = "a";
String s2 = null;
String s3 = "c";
String s4 = "d";
String concat = Stream.of(s1, s2, s3, s4)
        .filter(s -> s != null)
        .collect(Collectors.joining());
Run Code Online (Sandbox Code Playgroud)

abc
Run Code Online (Sandbox Code Playgroud)

有几点需要注意:

  • 您可以将数据结构(列表等)直接转换为Stream<String>.
  • 您还可以在将字符串连接在一起时给出分隔符.


Dav*_*ann 18

String s = null;
System.out.println("s: " + (s != null ? s : ""));
Run Code Online (Sandbox Code Playgroud)

但你真正要求的是一个空的合并运算符.

  • C#:``s:"+ s`..NET不会打印`null`..NET来自Java.许多Java错误没有重复. (4认同)
  • C#:"s:"+(s ??"") (3认同)

Roh*_*ain 9

您可以使用Apache CommonsStringUtils.defaultString(String)方法,或者如果您没有使用任何第三方库,您甚至可以编写自己的方法,只需一个班轮.

private static String nullToEmptyString(String str) {
    return str == null ? "" : str;
}
Run Code Online (Sandbox Code Playgroud)

然后在你的sysout中使用它:

System.out.println("s: " + nullToEmptyString(s));
Run Code Online (Sandbox Code Playgroud)


Cod*_*roc 7

您可以声明自己的方法concatenation:

public static String concat(String... s) 
{//Use varArgs to pass any number of arguments
    if (s!=null) {
       StringBuilder sb = new StringBuilder();
       for(int i=0; i<s.length; i++) {
          sb.append(s[i] == null ? "" : s[i]);
       }
       return sb.toString();
    }
    else {
        return "";
    }
}
Run Code Online (Sandbox Code Playgroud)


Stu*_*rks 7

另一种方法是使用java.util.Objects.toString()Java 7中添加的方法:

String s = null;
System.out.println("s: " + Objects.toString(s, ""));
Run Code Online (Sandbox Code Playgroud)

这适用于任何对象,而不仅仅是字符串,当然,您可以提供另一个默认值,而不仅仅是空字符串.