概述
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
对象并返回一个非null
的String
对象:
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));
}
StringJoiner
与String.join()
的一个区别是,不像String.join()
,我们需要遍历集合(如数组、列表等)来连接所有元素。
使用Streams.filter
(Java 8+)
Stream
API提供了大量有序和并行的聚合操作。其中一个中间流操作是filter()
,它接受一个Predicate
作为输入,并根据给定的Predicate
将流转换为另一个流。
因此,我们可以定义一个Predicate
,用于检查String
的null
值,然后将这个Predicate
传递给filter()
方法。这样,filter
会从原始流中过滤掉那些null
值。
最后,我们可以使用Collectors.joining()
收集所有非null
的String
值,最终将结果流收集到一个String
变量中:
result = Stream.of(values).filter(value -> null != value).collect(Collectors.joining(""));
总结
在这篇文章中,我们展示了避免拼接null
String
对象的各种方法。在满足需求时,总是有不止一种正确的方法。因此,我们必须确定在特定情况下哪种方法最适合。
我们需要注意的是,拼接String
本身可能是一个昂贵的操作,特别是在循环中。因此,始终建议考虑Java String
API的性能方面。
一如既往,这些示例的代码可以在GitHub上找到。