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

2022-09-01 01:13:43

我知道以下内容:

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

将输出:。s: null

我如何让它只输出s:

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

我问这个问题是因为我不想检查s1到s4的每个组合(即,检查这些变量是否为null或在最后替换为,因为我认为可能有一些更好的方法来做到这一点。"null"emptyString


答案 1

最简洁的解决方案是:

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

或者创建或使用静态帮助器方法来执行相同的操作;例如:

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

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

例如:

  • 如果这些 null 来自已默认初始化为 的 String 属性,请考虑将它们显式初始化为 。null""
  • 不要用于表示空数组或集合。null
  • 不要在最好抛出异常时返回。null
  • 请考虑使用空对象模式

现在显然有所有这些的反例,有时你必须处理一个预先存在的API,给你空......无论出于何种原因。但是,根据我的经验,最好避免使用...大多数时候。null

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

String s = "";  /* instead of null */
System.out.println("s: " + s);

答案 2

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

abc

需要注意的几点:

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