网站首页 > 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.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类
StringBuilder提供了一些构建字符串的方法,比如append()方法,我们可以使用该方法来完成字符串的拼接:
String[] values = {"小黑 ", null, "", "说 ", "Java!"};
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.filter(Java 8+)
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);
复制代码
小结
本期内容我们讲述了在连接字符串时,如果避免连接空字符串的各种方法,有很多种方法都可以满足我们的要求,所以我们应该找到最合适的哪一个。
要关注的一个点是连接字符串可能是一项昂贵的操作,所以要避免在循环中进行字符串连接,尤其是使用“+”操作符
原文链接:https://juejin.cn/post/7046574282276601864
猜你喜欢
- 2024-10-18 java面试题之三:字符串操作(字符串笔试题java)
- 2024-10-18 Jmeter BeanShell循环:字符串 拼接模式,为变量名 获取数据值
- 2024-10-18 初识java—(三十四)String、StringBuffer和StringBuilder类
- 2024-10-18 初学者都在坑里!不要在Python中使用“+”来连接字符串
- 2024-10-18 一段简单的关于字符串的Java 代码,竟然考察了这么多东西
- 2024-10-18 Java中字符串连接运算符“+”的困惑
- 2024-10-18 Guava之字符串连接,分割,匹配处理
- 2024-10-18 【老梁聊IT之JAVA篇】StringBuilder的正确使用方法详解
- 2024-10-18 为何Java8中不再需要StringBuilder拼接字符串
- 2024-10-18 为什么阿里巴巴不建议在循环体中使用+进行字符串拼接?
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)