概述

Java提供了多种方法和类用于拼接String对象。然而,如果我们不注意null对象,拼接后的String可能会包含一些不需要的值。本文将介绍在拼接String时避免null对象的一些方法。

问题陈述

假设我们想要拼接一个String数组,其中任何元素都可能是null

我们可以使用加号(+)运算符简单地实现:

String[] values = { "Java ", null, "", "is ", "great!" };
String result = "";

for (String value : values) {
    result = result + value;
}

这将把所有元素连接成一个String,如下所示:

Java nullis great!

但我们可能不想在输出中显示或添加这些“null”值。

同样,如果我们的应用程序运行在Java 8及以上版本,使用String.join()静态方法也会得到相同的输出:

String result = String.join("", values);

无论何时使用String.join()方法,我们也无法避免null元素被拼接。

接下来,我们将探讨一些方法,以避免这些null元素被拼接,并获得我们期望的结果:“Java is great!”。

使用加号运算符

在Java中,加号(+)运算符重载以拼接String。使用加号运算符拼接时,我们可以检查String是否为null,并用空字符串("")替换null String

for (String value : values) {
    result = result + (value == null ? "" : value);
}

assertEquals("Java is great!", result);

或者,我们可以提取检查null String的代码,将其封装到一个辅助方法中,该方法接受一个String对象并返回一个非nullString对象:

for (String value : values) {
    result = result + getNonNullString(value);
}

这里的getNonNullString()方法是我们的辅助方法。它只是检查输入String对象的null引用。如果输入对象为null,它将返回一个空字符串,否则返回相同的String

return value == null ? "" : value;

然而,正如我们所知,Java中的String对象是不可变的。这意味着每次使用加号运算符拼接String对象时,都会在内存中创建一个新的String。因此,使用加号运算符进行拼接可能会很昂贵(参阅:Java字符串性能)。

此外,我们可以使用这种方法,在其他支持拼接的操作中检查null String对象。让我们看看其中的一些例子。

使用String.concat()方法

当我们要拼接String对象时,String.concat()方法是一个不错的选择。

这里,我们可以使用getNonNullString()方法来避免在使用append()方法时遇到null对象:

for (String value : values) {
    result = result.concat(getNonNullString(value));
}

getNonNullString()方法返回的空字符串会被连接到结果中,从而忽略null对象。

使用StringBuilder

StringBuilder类提供了许多有用且方便的String构建方法。其中之一是append()方法。

同样,我们也可以使用相同的getNonNullString()方法,在使用append()方法时避免null对象:

for (String value : values) {
    result = result.append(getNonNullString(value));
}

使用StringJoiner类(Java 8+)

StringJoiner类提供了String.join()的所有功能,同时还允许您指定起始前缀和结束后缀。我们可以使用其add()方法来拼接String

像之前一样,我们可以使用辅助方法getNonNullString()来避免null String值被拼接:

StringJoiner result = new StringJoiner("");

for (String value : values) {
    result = result.add(getNonNullString(value));
}

StringJoinerString.join()的一个区别是,不像String.join(),我们需要遍历集合(如数组、列表等)来连接所有元素。

使用Streams.filter(Java 8+)

Stream API提供了大量有序和并行的聚合操作。其中一个中间流操作是filter(),它接受一个Predicate作为输入,并根据给定的Predicate将流转换为另一个流。

因此,我们可以定义一个Predicate,用于检查Stringnull值,然后将这个Predicate传递给filter()方法。这样,filter会从原始流中过滤掉那些null值。

最后,我们可以使用Collectors.joining()收集所有非nullString值,最终将结果流收集到一个String变量中:

result = Stream.of(values).filter(value -> null != value).collect(Collectors.joining(""));

总结

在这篇文章中,我们展示了避免拼接null String对象的各种方法。在满足需求时,总是有不止一种正确的方法。因此,我们必须确定在特定情况下哪种方法最适合。

我们需要注意的是,拼接String本身可能是一个昂贵的操作,特别是在循环中。因此,始终建议考虑Java String API的性能方面。

一如既往,这些示例的代码可以在GitHub上找到。