服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - java字符串拼接这种小事,我翻车了...

java字符串拼接这种小事,我翻车了...

2021-12-10 21:26Java技术指北指北君 Java教程

最近指北君在一个字符串拼接的小事情上翻车了,真的是万万没想到。Java 提供了多种方法和类可以用来拼接字符串。但是如果我们不注意 null 对象,则生成的 String 可能包含一些不需要的值。

java字符串拼接这种小事,我翻车了...

大家好,我是指北君。

最近指北君在一个字符串拼接的小事情上翻车了,真的是万万没想到。Java 提供了多种方法和类可以用来拼接字符串。但是如果我们不注意 null 对象,则生成的 String 可能包含一些不需要的值。

问题场景

假设我们要拼接的 String 数组的元素,其中任何元素都可能为 null。

举个例子

  1. String[] values = { "Java ", null, "", "is ", "great!" };
  2. String result = "";
  3. for (String value : values) {
  4. result = result + value;
  5. }

我们简单地使用 + 运算符执行拼接,得出来的结果是

  1. Java nullis great!

但是,我们正常情况肯定是不喜欢在结果中包含 "null" 值。

同样,如果我们的应用程序在 Java 8 或更高版本上运行,我们使用 String.join() 静态方法获得相同的输出:

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

我们也不能避免在使用 String.join() 方法时连接 null 元素。

让我们看看一些方法来避免这些空元素被串联起来,并获得我们期望的结果:"Java is great"

使用 + 运算符

加法 (+) 运算符被重载以连接 Java 中的字符串。在使用 + 运算符进行连接时,我们可以检查 String 是否为 null,并将 null 字符串替换为空 ("")字符串:

  1. for (String value : values) {
  2. result = result + (value == null ? "" : value);
  3. }
  4. assertEquals("Java is great!", result);

或者,我们可以将检查空字符串的代码提取到一个 getNonNullString() 方法中,该方法接受一个String对象并返回一个非空字符串对象:

  1. public String getNonNullString(value) {
  2. return value == null ? "" : value;
  3. }
  4. for (String value : values) {
  5. result = result + getNonNullString(value);
  6. }

但是 String 对象在Java中是不可变的。这意味着每次我们使用 + 运算符连接 String 对象时,都会在内存中创建一个新的 String。因此使用 + 运算符进行拼接是比较浪费资源的。

使用String.concat() 方法

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

在这里,我们可以使用我们的 getNonNullString() 方法,该方法检查空对象并返回空字符串:

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

getNonNullString()方法返回的空字符串与结果串联,从而忽略null对象。

使用StringBuilder类

StringBuilder 提供了一堆有用且方便的字符串构建方法。其中之一是 append() 方法。

在这里,我们可以使用相同的 getNonNullString() 方法来避免在使用 append() 方法时出现空对象:

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

使用StringJoiner类 (Java 8+)

StringJoiner 类提供了 String.join() 的所有功能,以及一个以给定前缀开头并以给定后缀结尾的选项。我们可以使用它的 add()方法来连接字符串s。

和以前一样,我们可以使用我们的帮助器方法 getNonNullString() 来避免空字符串值被串联起来:

  1. StringJoiner result = new StringJoiner("");
  2. for (String value : values) {
  3. result = result.add(getNonNullString(value));
  4. }

String.join() 和 StringJoiner 之间的一个区别是,与 String.join() 不同,我们必须遍历集合(Array、List等)来联接所有元素。

使用Streams.filter (Java 8+)

Stream API 提供大量顺序和并行聚合操作。一个这样的中间流操作是过滤器,它接受一个谓词作为输入,并根据给定的谓词将流转换为另一个流。

因此,我们可以定义一个谓词,该谓词将检查字符串的空值,并将此谓词传递给filter()方法。因此,筛选器将从原始流中筛选出这些空值。

最后,我们可以使用Collectors.joining()连接所有这些非空字符串值,最后将生成的Stream收集到String变量中:

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

总结

在本文中,我们演示了避免 null 字符串对象串联的各种方法。总会有不止一种正确的方法来满足我们的要求。因此,我们必须确定哪种方法最适合给定的地方。

我们必须记住,连接String本身可能是一个昂贵的操作,特别是在循环中。因此,始终建议考虑 Java 字符串 API 的性能。

原文链接:https://mp.weixin.qq.com/s/wn9SfRaCp7YCTzKnWXe7Mw

延伸 · 阅读

精彩推荐
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7482021-02-04
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17