Java 8中字符串拼接新姿势StringJoiner详解

  

在为什么阿里巴巴不建议在为循环中使用“+”进行字符串拼接一文中,我们介绍了几种Java中字符串拼接的方式,以及优缺点。其中还有一个重要的拼接方式我没有介绍,那就是Java 8中提供的StringJoiner,本文就来介绍一下这个字符串拼接的新兵。

  

如果你想知道一共有多少种方法可以进行字符串拼接,教你一个简单的办法,在Intellij IDEA中,定义一个Java Bean,然后尝试使用快捷键自动生成一个toString方法,想法会提示多种toString生成策略可供选择。

  11111年

  

目前我使用的想法的toString生成策略默认的是使用JDK 1.8提供的StringJoiner。

  

介绍
  

  

StringJoiner是java.util包中的一个类,用于构造一个由分隔符分隔的字符序列(可选),并且可以从提供的前缀开始并以提供的后缀结尾。虽然这也可以在StringBuilder类的帮助下在每个字符串之后附加分隔符,但StringJoiner提供了简单的方法来实现,而无需编写大量代码。

  

StringJoiner类共有2个构造函数,5个公有方法。其中最常用的方法就是添加方法和toString方法,类似于StringBuilder中的附加方法和toString方法。

  

用法
  

  

StringJoiner的用法比较简单、下面的代码中,我们使用StringJoiner进行了字符串拼接。

        公开课StringJoinerTest {      公共静态void main (String [] args) {   StringJoiner sj=new StringJoiner(“霍利斯”);      sj.add (“hollischuang”);   Java干sj.add(“货”);   System.out.println (sj.toString ());      StringJoiner sj1=new StringJoiner (“:”,“[”、“]”);      sj1.add阀门(“霍利斯”)(“hollischuang”)阀门(“Java干货”);   System.out.println (sj1.toString ());   }   }      

以上代码输出结果:

        hollischuangHollisJava干货   [霍利斯:hollischuang: Java干货)      

值得注意的是,当我们StringJoiner (CharSequence进行分隔符)初始化一个StringJoiner的时候,这个分隔符其实是分隔符,并不是可变字符串的初始值。

  

StringJoiner (CharSequence进行分隔符,CharSequence进行前缀,后缀CharSequence进行)的第二个和第三个参数分别是拼接后的字符串的前缀和后缀。

  

原理
  

  

介绍了简单的用法之后,我们再来看看这个StringJoiner的原理,看看他到底是如何实现的。主要看一下添加方法:

        公共StringJoiner添加(CharSequence进行newElement) {   prepareBuilder () .append (newElement);   返回;   }      私人StringBuilder prepareBuilder () {   如果(价值!=null) {   value.append(分隔符);   其他}{   值=https://www.yisu.com/zixun/new StringBuilder () .append(前缀);   }   返回值;   }      

看到了一个熟悉的身影——StringBuilder,没错,StringJoiner其实就是依赖StringBuilder实现的,在为什么阿里巴巴不建议在为循环中使用“+”进行字符串拼接中我们介绍过StringBuilder的实现原理,本文不在赘述。

  

当我们发现StringJoiner其实是通过StringBuilder实现之后,我们大概就可以猜的到,他的性能损耗应该和直接使用StringBuilder差不多!

  

<强>为什么需要StringJoiner
  

  

在了解了StringJoiner的用法和原理后,可能很多读者就会产生一个疑问,明明已经有一个StringBuilder了,为什么Java 8中还要定义一个StringJoiner呢?到底有什么好处呢?

  

如果读者足够了解Java 8的话,或许可以猜出个大概,这肯定和流有关。

  

作者也在Java文档中找到了答案:

  
  

StringJoiner可以用来使用Collectors.joining创建格式化输出流(CharSequence进行)

     

试想,在Java中,如果我们有这样一个列表:

        List=ImmutableList.of列表(“霍利斯”,“hollischuang”,“Java干货”);      

如果我们想要把他拼接成一个以下形式的字符串:

        霍利斯,hollischuang Java干货      

可以通过以下方式:

        StringBuilder builder=new StringBuilder ();      如果(! list.isEmpty ()) {   builder.append (list.get (0));   for (int i=1, n=list.size ();我& lt;n;我+ +){   builder.append (", ") .append (list.get(我));   }   }    builder.toString ();      

Java 8中字符串拼接新姿势StringJoiner详解