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

44

我知道以下内容:

String s = null;
System.out.println("s: " + s);

将输出:s: null

如何使它只输出s:

在我的情况下,这很重要,因为我必须从4个值中连接Strings1,s2,s3,s4其中每个值可能具有null

我提出这个问题是因为我不想检查 s1 到 s4 的每种组合 (即,检查这些变量是否为null 或在最后替换"null"empty String,因为我认为可能有更好的方法来处理它。


3
有趣的事实(并非您问题的答案):鉴于Java语言有多挑剔,字符串连接从不对null抛出异常可能会让人感到惊讶,即使您在null本身上使用+=。例如:String s = null; s += null;。在这两个语句之后,s成为明显非空的字符串"nullnull"。也可以安全地连接一个非null但其toString()方法被重写为返回 null的对象。在所有情况下,连接都会将“null”替换为null - Boann
Stack Overflow网站上线近6年,为什么这个问题还没有被标记为重复? - Peter Mortensen
“null String”和“null reference”是有区别的。 “null String”是"",不会打印任何内容。而null reference甚至不是一个字符串。 - Hot Licks
10
我尝试查找重复内容,但每次搜索结果都显示“null”。 - Hot Licks
2
相关:Java中连接空字符串 - Izkata
8个回答

47

最简洁的解决方案是:

System.out.println("s: " + (s == null ? "" : s));

或者创建或使用静态辅助方法来完成相同的操作; 例如。
System.out.println("s: " + denull(s));

然而,这个问题似乎是一个过度使用/滥用null的应用程序。最好只在具有特定含义并且需要与非空值的含义不同(并且需要不同)时使用/返回null
例如:
  • 如果这些null来自已默认初始化为null的String属性,请考虑将它们明确初始化为“”
  • 不要使用null表示空数组或集合。
  • 最好抛出异常而不是返回null
  • 可以考虑使用Null Object Pattern
显然,这些都有反例,并且有时您必须处理预先存在的API,该API给出nulls...出于某种原因。然而,根据我的经验,大多数情况下最好避免使用null
因此,在您的情况下,更好的方法可能是:
String s = "";  /* instead of null */
System.out.println("s: " + s);

13
java.util.Objects.toString(obj, default) 是库函数中等同于 denull() 的方法。关于 null 的建议总体来说很好。+1. - Stuart Marks
2
@StuartMarks - 它和 denull 做的事情是一样的。但是一个特殊目的的辅助方法会更加简洁。 - Stephen C
我将这个特殊的辅助函数命名为"nullToEmpty(...)",但在语义上它与"deNull(...)"是完全相同的。 - Hartmut Pfarr
OP 显然正在寻找一种简洁的方法来进行测试,而我正在迎合这一点。 - Stephen C

39
你可以在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());

提供

acd

一些需要注意的事项:
- 你可以直接将数据结构(如列表等)转换为 `Stream`。 - 当将字符串连接在一起时,你还可以指定分隔符。

这是连接字符串的好方法!还要注意,您可以使用StringUtils的函数接口进行空值检查,例如:.filter(StringUtils::isNotBlank) - Tom Wellbrock
不错!但是你可以使用方法引用 'Objects::nonNull' 替换 lambda。 - abarazal
@Skiwi 回应应该是“acd”而不是“abc”。请修正拼写错误。 - undefined

19
String s = null;
System.out.println("s: " + (s != null ? s : ""));

但是你实际上需要的是一个null合并运算符


3
C#: "s: " + (s ?? "") - BlackBear
4
C#: "s: " + s。.NET 不会输出 null。.NET 是在 Java 之后出现的,避免了许多 Java 的错误。 - usr

11

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

String s = null;
System.out.println("s: " + Objects.toString(s, ""));

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


10
您可以使用Apache Commons StringUtils.defaultString(String) 方法,或者如果您不使用任何第三方库,甚至可以编写只有一行代码的自己的方法。
private static String nullToEmptyString(String str) {
    return str == null ? "" : str;
}

然后在您的sysout中使用它,如下所示:

System.out.println("s: " + nullToEmptyString(s));

7
您可以声明自己的方法来进行字符串拼接:
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 "";
    }
}

4

试试这个

String s = s == null ? "" : s;
System.out.println("s: " + s);

当一个字符串变量(这里是s)没有被赋值时,它被称为null。因此,使用空字符串""初始化该变量;然后您可以连接字符串。

如果您的s变量可能为null或非null,请在进一步使用之前使用条件运算符。然后变量s将不再为null。

以下是示例代码:

    String s1 = "Some Not NULL Text 1 ";
    String s2 = null;
    String s3 = "Some Not NULL Text 2 ";

    s1 = s1 == null ? "" : s1;
    s2 = s2 == null ? "" : s2;
    s3 = s3 == null ? "" : s3;

    System.out.println("s: " + s1 + s2 + s3);

示例输出:

s: 一些非空文本1 一些非空文本2


这不是我要问的。 - syntagma
@REACHUS 我已更改代码,使用 s = s == null ? "" : s; 语句来恢复空字符串。 - user3717646
@REACHUS 请检查您的输出是否存在问题? - user3717646

1

我能想到两种方法,第一种不使用连接操作符但是更安全:

public static void substituteNullAndPrint(String format, String nullString, Object... params){
    String[] stringParams = new String[params.length()];
    for(int i=0; i<params.length(); i++){
        if(params[i] == null){
            stringParams[i] = nullString;
        }else{
            stringParams[i] = params[i].toSTring();
        }
    }

    String formattedString = String.format(format, stringParams);
    System.out.println(formattedString);
}

USAGE:
substituteNullAndPrint("s: %s,%s", "", s1, s2);

第二种方法使用拼接,但要求您的实际字符串从不包含“null”,因此它只适用于非常简单的情况(无论如何,即使您的字符串从未为“null”,我也永远不会使用它)。
public static void substituteNullAndPrint(String str){
    str.replace("null", "");
    System.out.println(str);
}

USAGE:
substituteNullAndPrint("s: " + s1);

注意事项:

- 由于我反对内联大量条件语句,因此两者都使用外部实用程序方法。

- 这没有经过测试,我可能会混淆c#语法和Java。


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