首页 > 应用开发 > Java > 连接字符串除了“+”还有哪些方法
在Java中进行字符串连接有各种方法,但是如果在进行连接时,如果我们不注意空对象,那么最后的结果可能会包含不是我们预期的值。
在本期内容中,我讲给大家讲述一些在连接字符串时处理空字符串对象的方法。
假设我们要对一个字符串数据中的元素进行连接,数组中的元素有可能为空,我们先用“+”进行简单的拼接:
String
[
] values
=
{
"小黑 "
,
null
,
""
,
"说 "
,
"Java!"
}
;
String result
=
""
;
for
(String value
: values
)
{
result
= result
+ value
;
}
上面的代码会将数组中的所有元素都进行连接,最后的结果如下:
![]()
但是我们的期望可能是不想在结果中将空对象连接成一个“null”值。
如果我们的程序是在Java 8+版本,可以使用
String.Join()方法获得相同的输出:
String
[
] values
=
{
"小黑 "
,
null
,
""
,
"说 "
,
"Java!"
}
;
String result
= String
.
join
(
""
, values
)
;
System
.out
.
println
(result
)
;
但是使用
String.join()方法同样不能避免将空对象连接成一个"null"值。
![]()
接下来,我们来看一下有哪些可以避免将空对象连接成“null”值的方法,最后的结果输出“
小黑 is coder!”.
在使用**+**运算符连接时,我们可以检查字符串是否为NULL,并将NULL字符串替换为空字符串:
String
[
] values
=
{
"小黑 "
,
null
,
""
,
"说 "
,
"Java!"
}
;
String result
=
""
;
for
(String value
: values
)
{
result
= result
+
(value
==
null
?
""
: value
)
;
}
这样可以实现将空对象转成空字符串连接。但是,我们都知道在Java中字符串对象是不可变的,这意味着我们每次进行“+”操作时,都会在内存中创建一个新的对象,所以要避免在代码中频繁的进行字符串“+”操作。
String.concat()方法是一个比较好的选择。
String
[
] values
=
{
"小黑 "
,
null
,
""
,
"说 "
,
"Java!"
}
;
String result
=
""
;
for
(String value
: values
)
{
result
= result
.
concat
(
(value
==
null
?
""
: value
)
)
;
}
System
.out
.
println
(result
)
;
查看
concat()方法的源码我们可以发现,
concat()方法如果传入的参数为null,会抛出空指针异常,这一点和使用“+”操作符有区别,
concat()最后也会创建一个新的String对象。

StringBuilder提供了一些构建字符串的方法,比如append()方法,我们可以使用该方法来完成字符串的拼接:
String
[
] values
=
{
"小黑 "
,
null
,
""
,
"说 "
,
"Java!"
}
;
//java学习交流:603835449 进入可领取学习资源及对十年开发经验大佬提问,免费解答!
StringBuilder result
=
new
StringBuilder
(
)
;
for
(String value
: values
)
{
result
.
append
(
(value
==
null
?
""
: value
)
)
;
}
System
.out
.
println
(result
)
;
使用StringJoiner类(Java 8+)
StringJoiner类中包含String.join()方法的功能,并且可以在做拼接时指定前缀、后缀。
我们可以使用StringJoiner的add()方法来连接字符串:
String
[
] values
=
{
"小黑 "
,
null
,
""
,
"说 "
,
"Java!"
}
;
StringJoiner result
=
new
StringJoiner
(
""
)
;
for
(String value
: values
)
{
result
.
add
(
(value
==
null
?
""
: value
)
)
;
}
System
.out
.
println
(result
)
;
StringJoiner和
Stirng.join()的区别在于
String.join()可以直接传入一个集合,而
StringJoiner只能对单个字符串进行拼接。
Stream API提供了大量的顺序和并行聚合操作。我们可以使用filter方法,filter方法接受一个
Predicate,并会基于这个
Predicate将初始流转换成另一个流对象。
所以,我们可以定义一个
Predicate来检查字符串的空值,并将该
Predicate传递给
filter()方法,这样
filter()将会把原始流中的空对象过滤掉;
最后,我们可以使用
Collectors.joining()连接所有这些非空字符串值,将结果流收集到一个字符串变量中:
String
[
] values
=
{
"小黑 "
,
null
,
""
,
"说 "
,
"Java!"
}
;
String result
= Stream
.
of
(values
)
.
filter
(value
-
>
null
!= value
)
.
collect
(Collectors
.
joining
(
""
)
)
;
System
.out
.
println
(result
)
;
本期内容我们讲述了在连接字符串时,如果避免连接空字符串的各种方法,有很多种方法都可以满足我们的要求,所以我们应该找到最合适的哪一个。
要关注的一个点是连接字符串可能是一项昂贵的操作,所以要避免在循环中进行字符串连接,尤其是使用“+”操作符。
流水不争先,贵在滔滔不绝
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70010294/viewspace-2849941/ ,如需转载,请注明出处,否则将追究法律责任。