• 互联网新闻信息服务许可证 2019-05-05
  • 党史人物纪念馆(封面) 2019-05-03
  • 西班牙爱维华葡萄酒:你深藏闺中,却被我发现葡萄酒 经理 2019-04-25
  • 赋予妇女更多权利!沙特首次向女性发驾照 2019-04-25
  • 张德江:必须毫不动摇坚持、与时俱进完善人民代表大会制度 2019-04-25
  • 凤凰好书榜∣第46周周榜 2019-04-24
  • 不断的烧钱和融资 共享单车这门“生意”将走到哪里 2019-04-24
  • 在“街角博物馆”中找寻来自唐朝的“雕刻时光” 2019-04-21
  • 流口水!重庆百家宴香气四溢 三千多人齐聚庆新年 2019-04-20
  • 广州市增城区人民法院公告专栏 2019-04-17
  • 六一儿童节 盘点小朋友爱玩的“爆款”游戏 2019-04-17
  • 公安部超提气短视频:此生无悔披战甲 来世还要做警察 2019-04-12
  • 家国情怀·天人和谐·文化自信——从端午文化看民族精神传承 2019-04-12
  • 苏州平江路,市中心的历史古迹!文章中国国家地理网 2019-04-07
  • 榕城监狱及时调解服刑人员家属建房纠纷 2019-04-07
  • 天道不一定酬所有勤
    但是,天道只酬勤

    上海时时乐新浪彩:Java 8中字符串拼接新姿势:StringJoiner

    开发十年,就只剩下这套架构体系了??!

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

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

    ?

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

    介绍

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

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

    用法

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

    public class StringJoinerTest {
    
        public static void main(String[] args) {
            StringJoiner sj = new StringJoiner("Hollis");
    
            sj.add("hollischuang");
            sj.add("Java干货");
            System.out.println(sj.toString());
    
            StringJoiner sj1 = new StringJoiner(":","[","]");
    
            sj1.add("Hollis").add("hollischuang").add("Java干货");
            System.out.println(sj1.toString());
        }
    }
    

    以上代码输出结果:

    hollischuangHollisJava干货
    [Hollis:hollischuang:Java干货]
    

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

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

    原理

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

    public StringJoiner add(CharSequence newElement) {
        prepareBuilder().append(newElement);
        return this;
    }
    
    private StringBuilder prepareBuilder() {
        if (value != null) {
            value.append(delimiter);
        } else {
            value = new StringBuilder().append(prefix);
        }
        return value;
    }
    

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

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

    为什么需要StringJoiner

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

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

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

    A StringJoiner may be employed to create formatted output from a Stream using Collectors.joining(CharSequence)

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

    List<String> list = ImmutableList.of("Hollis","hollischuang","Java干货");
    

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

    Hollis,hollischuang,Java干货
    

    可以通过以下方式:

    StringBuilder builder = new StringBuilder();
    
    if (!list.isEmpty()) {
        builder.append(list.get(0));
        for (int i = 1, n = list.size(); i < n; i++) {
            builder.append(",").append(list.get(i));
        }
    }
    builder.toString();
    

    还可以使用:

    list.stream().reduce(new StringBuilder(), (sb, s) -> sb.append(s).append(','), StringBuilder::append).toString();
    

    但是输出结果稍有些不同,需要进行二次处理:

    Hollis,hollischuang,Java干货,
    

    还可以使用”+”进行拼接:

    list.stream().reduce((a,b)->a + "," + b).toString();
    

    以上几种方式,要么是代码复杂,要么是性能不高,或者无法直接得到想要的结果。

    为了满足类似这样的需求,Java 8中提供的StringJoiner就派上用场了。以上需求只需要一行代码:

    list.stream().collect(Collectors.joining(":"))
    

    即可。上面用的表达式中,Collectors.joining的源代码如下:

    public static Collector<CharSequence, ?, String> joining(CharSequence delimiter,
                                                             CharSequence prefix,
                                                             CharSequence suffix) {
        return new CollectorImpl<>(
                () -> new StringJoiner(delimiter, prefix, suffix),
                StringJoiner::add, StringJoiner::merge,
                StringJoiner::toString, CH_NOID);
    }
    

    其实现原理就是借助了StringJoiner。

    当然,或许在Collector中直接使用StringBuilder似乎也可以实现类似的功能,只不过稍微麻烦一些。所以,Java 8中提供了StringJoiner来丰富Stream的用法。

    而且StringJoiner也可以方便的增加前缀和后缀,比如我们希望得到的字符串是[Hollis,hollischuang,Java干货]而不是Hollis,hollischuang,Java干货的话,StringJoiner的优势就更加明显了。

    总结

    本文介绍了Java 8中提供的可变字符串类——StringJoiner,可以用于字符串拼接。

    StringJoiner其实是通过StringBuilder实现的,所以他的性能和StringBuilder差不多,他也是非线程安全的。

    如果日??⒅兄?,需要进行字符串拼接,如何选择?

    1、如果只是简单的字符串拼接,考虑直接使用”+”即可。

    2、如果是在for循环中进行字符串拼接,考虑使用StringBuilderStringBuffer。

    3、如果是通过一个List进行字符串拼接,则考虑使用StringJoiner。

    (全文完) 欢迎关注『Java之道』微信公众号
    赞(15)
    如未加特殊说明,此网站文章均为原创,转载必须注明出处。上海的时时乐中奖号码 » Java 8中字符串拼接新姿势:StringJoiner
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址

    HollisChuang's Blog

    联系我关于我
  • 互联网新闻信息服务许可证 2019-05-05
  • 党史人物纪念馆(封面) 2019-05-03
  • 西班牙爱维华葡萄酒:你深藏闺中,却被我发现葡萄酒 经理 2019-04-25
  • 赋予妇女更多权利!沙特首次向女性发驾照 2019-04-25
  • 张德江:必须毫不动摇坚持、与时俱进完善人民代表大会制度 2019-04-25
  • 凤凰好书榜∣第46周周榜 2019-04-24
  • 不断的烧钱和融资 共享单车这门“生意”将走到哪里 2019-04-24
  • 在“街角博物馆”中找寻来自唐朝的“雕刻时光” 2019-04-21
  • 流口水!重庆百家宴香气四溢 三千多人齐聚庆新年 2019-04-20
  • 广州市增城区人民法院公告专栏 2019-04-17
  • 六一儿童节 盘点小朋友爱玩的“爆款”游戏 2019-04-17
  • 公安部超提气短视频:此生无悔披战甲 来世还要做警察 2019-04-12
  • 家国情怀·天人和谐·文化自信——从端午文化看民族精神传承 2019-04-12
  • 苏州平江路,市中心的历史古迹!文章中国国家地理网 2019-04-07
  • 榕城监狱及时调解服刑人员家属建房纠纷 2019-04-07
  • 北京pk10谁能控制结果 时时彩计划 重庆时时彩三星杀号网 中国足彩网赛事中心 高频彩可以赚钱吗 福利彩票开奖结果查询 天津时时彩开奖号码结果 七星彩走势图大小 欢乐生肖时时彩 京东彩票代购性质 体彩篮球让分胜负 3d和值走势图 江苏福彩官网 百家乐开户 新疆时时彩三星和值尾 现场报码直播