大家好,我是北君。近日,知背君因为一件拼弦的小事翻车,着实让人始料未及。Java提供了各种可用于连接字符串的方法和类。但是如果我们不注意null对象,结果String可能包含一些不需要的值。问题场景假设我们正在连接一个String数组的元素,其中任何元素都可能为null。例如String[]values={"Java",null,"","is","great!"};Stringresult="";for(Stringvalue:values){result=result+value;}我们只是使用+运算符执行连接,结果是Javanullisgreat!然而,我们通常不喜欢结果中有“空”值。同样,如果我们的应用程序运行在Java8或更高版本上,我们使用String.join()静态方法来获得相同的输出:Stringresult=String.join("",values);我们也无法避免使用String.join()方法连接空元素。让我们看一下避免连接这些空元素并获得我们想要的结果的一些方法:使用+运算符的“Javaisgreat”加法(+)运算符被重载以连接Java中的字符串。当与+运算符连接时,我们可以检查字符串是否为null并将空字符串替换为空("")字符串:for(Stringvalue:values){result=result+(value==null?"":value);}assertEquals("Java很棒!",result);或者,我们可以将检查空字符串的代码提取到getNonNullString()方法中,该方法接受一个String对象并返回一个非空String对象:publicStringgetNonNullString(value){returnvalue==null?"":value;}for(Stringvalue:values){result=result+getNonNullString(value);}但String对象在Java中是不可变的。这意味着每次我们使用+运算符连接String对象时,都会在内存中创建一个新的String。因此,使用+运算符进行拼接是一种资源浪费。使用String.concat()方法当我们想要连接String对象时,String.concat()方法是一个不错的选择。这里我们可以使用我们的getNonNullString()方法,它检查空对象并返回一个空字符串:for(Stringvalue:values){result=result.concat(getNonNullString(value));}getNonNullString()方法返回一个空字符串是与结果连接,从而忽略空对象。使用StringBuilder类StringBuilder提供了一堆有用和方便的字符串构造方法。其中之一是append()方法。这里我们可以在使用append()方法时使用相同的getNonNullString()方法来避免空对象:for(Stringvalue:values){result=result.append(getNonNullString(value));}使用StringJoiner类(Java8+)StringJoiner类提供了String.join()的所有功能,以及以给定前缀开始和以给定后缀结束的选项。我们可以使用它的add()方法来连接字符串s。和以前一样,我们可以使用我们的辅助方法getNonNullString()来避免空字符串值被连接起来:StringJoinerresult=newStringJoiner("");for(Stringvalue:values){result=result.add(getNonNullString(value));}String.join()和StringJoiner之间的一个区别是,与String.join()不同,我们必须遍历集合(Array、List等)以连接所有元素。使用Streams.filter(Java8+),StreamAPI提供了大量的顺序和并行聚合操作。一个这样的中间流操作是过滤器,它将谓词作为输入并根据给定的谓词将一个流转换为另一个流。所以我们可以定义一个谓词,它将检查字符串中的空值,并将这个谓词传递给filter()方法。因此,过滤器会从原始流中过滤掉这些空值。最后,我们可以使用Collectors.joining()来连接所有这些非空字符串值,最后将结果Stream收集到一个String变量中:result=Stream.of(values).filter(value->null!=value).收集(收集器。加入(“”));总结在本文中,我们演示了避免连接空字符串对象的各种方法。总会有不止一种正确的方式来满足我们的要求。因此,我们必须确定哪种方法最适合给定的地方。我们必须记住,连接String本身可能是一项昂贵的操作,尤其是在循环中。因此,始终建议考虑JavaStringAPI的性能。
