浅谈Java8对字符串连接的改进正确姿势
我们提出一个需求:有一个List
毋庸置疑,Java8之前我们的第一反应是使用StringBuilder:
publicstaticStringformatList(Listlist,Stringdelimiter){ StringBuilderresult=newStringBuilder(); for(Stringstr:list){ result.append(str).append(delimiter); } //删除末尾多余的delimiter result.delete(result.length()-delimiter.length(),result.length()); returnresult.toString(); } publicstaticvoidmain(String[]args)throwsException{ List list=Arrays.asList("a","b","c","d","e","f","g"); System.out.println("使用StringBuilder:"); Stringformat=formatList(list,","); System.out.println(format); }
运行结果:
JDK1.8时,添加了一个新的用于字符串连接的类,专门用于这种需要分隔符的场合,它就是StringJoiner。StringJoiner在构造时可以指定一个分隔符(delimiter),然后每连接一个元素它便会加上一个delimiter,使用StringJoiner改写formatList:
publicstaticStringformatList(Listlist,Stringdelimiter){ StringJoinerresult=newStringJoiner(delimiter); for(Stringstr:list){ result.add(str); } returnresult.toString(); } publicstaticvoidmain(String[]args)throwsException{ List list=Arrays.asList("a","b","c","d","e","f","g"); System.out.println("使用StringJoiner:"); Stringformat=formatList(list,","); System.out.println(format); }
运行结果:
formatList的代码更加的简洁了——当然我们还可以更简洁——JDK1.8为String类添加了一个新的静态方法,String.join:
可以看到,第一个参数为一个分隔符delimiter,第二个参数可以是一个Iterable,或者是一个变长参数的CharSequence(String就是CharSequence的子类)。所以formatList方法只需要一句代码就搞定:
publicstaticStringformatList(Listlist,Stringdelimiter){ returnString.join(delimiter,list); }
当然,我们能猜到,String.join方法的功能内部是通过StringJoiner来实现的,String.join(CharSequence,Iterable)的源码:
但是我们看到了String.join方法的不足——它不能指定前缀和后缀——比如我们如果想要直接将List
查看StringJoiner的构造方法,发现StringJoiner除了指定分隔符的构造方法,还有一个可以指定分隔符、前缀和后缀的构造方法:
修改formatList:
publicstaticStringformatList( Listlist,Stringdelimiter,Stringprefix,Stringsuffix){ StringJoinerresult=newStringJoiner(delimiter,prefix,suffix); for(Stringstr:list){ result.add(str); } returnresult.toString(); } publicstaticvoidmain(String[]args)throwsException{ List list=Arrays.asList("a","b","c","d","e","f","g"); System.out.println("使用StringJoiner,带前缀和后缀:"); Stringformat=formatList(list,",","{","}"); System.out.println(format); }
运行结果:
很棒~但能不能更简洁呢?事实上,Java8对于字符串集合的连接操作提供了一个专门的流式API,即Collectors.joining
函数:!
那怎么使用呢?我们直接使用三个参数的Collectors.joining方法改写formatList:
publicstaticStringformatList( Listlist,Stringdelimiter,Stringprefix,Stringsuffix){ returnlist.stream().collect(Collectors.joining(delimiter,prefix,suffix)); } publicstaticvoidmain(String[]args)throwsException{ List list=Arrays.asList("a","b","c","d","e","f","g"); System.out.println("使用Collectors.joining:"); Stringformat=formatList(list,",","{","}"); System.out.println(format); }
运行结果:
查看StringJoiner的源码,我们可以知道StringJoiner的底层实现就是StringBuilder——Java8将使用分隔符连接多个字符串这一功能进行封装,提供这么多易用且简介的API,确实在很大程度上方便了编码。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。