当前位置: 首页 > 科技观察

在Java中连接字符串的N种方法

时间:2023-03-16 19:22:46 科技观察

1.前言Java提供了多种拼接String的方式,但是有时候如果我们不注意空字符串,可能会把null拼接到结果中,这显然不是我们想要的。在本文中,我们将介绍一些在拼接String时避免空值的方法。2.问题复现如果我们想拼接String数组,可以简单的使用+操作符拼接,但是可能会遇到空值。String[]values={"https","://","www.","wdbyte",".com",null};Stringresult="";for(Stringvalue:values){result=result+value;}这会将所有元素拼接成结果字符串,如下所示:https://www.wdbyte.comnull但是,我们发现了一个问题,最后一个空值也拼接为一个字符串,即显然不是我们想要的。此外,即使我们在Java8或更高版本上运行,然后使用String.join()静态方法连接字符串,我们也会得到空值的输出。String[]values={"https","://","www.","wdbyte",".com",null};Stringresult=String.join("",values);//output:https://www.wdbyte.comnull我们来看看一些可以防止空值被拼接的方法。我的预期输出应该是:https://www.wdbyte.com3.使用+运算符加符号+可以拼接String字符串,那么我们只需要在拼接的时候进行null判断,将null值替换为空字符串即可。for(Stringvalue:values){result=result+(value==null?"":value);}但是,我们知道String是不可变对象,使用+号会频繁创建string对象,每次A新字符串是在内存中创建的,因此使用+号连接字符串是昂贵的。为了后续代码演示方便,我们抽取一个可以传入字符串,返回非空字符串的方法。publicStringnullToString(Stringvalue){返回值==null?"":value;}所以上面的代码可以改成调用这个方法:for(Stringvalue:values){result=result+nullToString(value);}4.使用String.concat()String.concat()是String类自带的方法。使用此方法连接字符串非常方便。for(Stringvalue:values){result=result.concat(getNonNullString(value));}因为调用了nullToString()方法,结果中没有空值。5、使用StringBuilderStringBuilder类提供了很多有用和方便的String构造方法。比较常用的方法是append()方法,用于连接字符串,与nullToString()方法结合使用可以避免空值。String[]values={"https","://","www.","wdbyte",".com",null};StringBuilderresult=newStringBuilder();for(Stringvalue:values){result=result.append(nullToString(value));}可以得到如下结果:https://www.wdbyte.com6。使用StringJoiner类(Java8+)StringJoiner类提供了更强大的字符串拼接功能,不仅可以指定拼接时的分隔符,还可以指定拼接时的前缀和后缀。这里我们可以使用它的add()方法来拼接字符串。还可以使用nullToString()方法来避免空值。String[]values={"https","://","www.","wdbyte",".com",null};StringJoinerresult=newStringJoiner("");for(Stringvalue:values){result=result.add(nullToString(value));}7.使用Streams.filter(Java8+)StreamAPI是Java8引入的一个强大的流式操作类,可以进行常见的过滤、映射、遍历、分组、统计等操作。过滤操作filter可以接收一个Predicate函数。Predicate函数接口与前面介绍的Function(opensnewwindow)接口相同。它是一个功能接口。它可以接受一个通用的参数并返回一个布尔类型。谓词通常用于数据过滤。因此,我们可以定义一个Predicate来检查空字符串,然后传递给StreamAPI的filter()方法。最后,使用Collectors.joining()方法连接剩余的非空字符串。String[]values={"https","://","www.","wdbyte",".com",null};字符串结果=数组。流(值)。过滤器(对象::非空).collect(Collectors.joining());8.总结本文介绍了几种连接非空字符串的方法。不同的方式可能适用于不同的场景,但需要注意的是,连接String字符串是一个代价高昂的操作,下面是使用JMH对几种拼接方法进行基准测试的结果。BenchmarkModeCntScoreErrorUnitsStringConcat.operateAddthrpt2513635005.992±549759.774ops/sStringConcat.String.concatthrpt257465193.417±667928.552ops/sStringConcat.StringBuilderthrpt2513949781.608±142001.421ops/sStringConcat.StringJoinerthrpt259502405.473±211977.433ops/sStringConcat.StreamFilterthrpt258998396.107±649033.722ops/s可见StringBuilder的性能是最好的。在实际使用中,需要结合具体场景,选择性能开销最低的方式。