• 你只会用 StringBuilder?试试 StringJoiner,真香!


    你只会用 StringBuilder/ StringBuffer 拼接字符串?

    那你就 OUT 了!!

    如果需要拼接分隔符的字符串,建议使用 Java 8 中的这款拼接神器:StringJoiner,你值得拥有。

    StringJoiner 基本使用

    字面上理解就是用来拼接字符串的,一般需要分隔符进行拼接,如:

    hello, guys, 欢迎关注公众号Java技术栈

    这种三段式由 "," 分隔的字符串,在 Java 8 之前要使用 StringBuilder/ StringBuffer 进行拼接,如:

    StringBuilder sb = new StringBuilder();
    sb.append("hello");
    sb.append(",");
    sb.append("guys");
    sb.append(",");
    sb.append("欢迎关注公众号Java技术栈");
    String str = sb.toString();
    

    都是相同的分隔符逗号,这样拼接显然过于傻瓜式,如果要拼接的字符串非常多,代码会十分难看,写完感觉要崩溃。

    然而 Java 8 之后有了 StringJoiner,这件事件就变得更简单,分隔符这种全部一次性交给 StringJoiner 即可。

    StringJoiner 基本使用示例:

    public static void main(String[] args) {
    	StringJoiner stringJoiner = new StringJoiner(",");
    	stringJoiner.add("hello");
    	stringJoiner.add("guys");
    	stringJoiner.add("欢迎关注公众号Java技术栈");
    	System.out.println(stringJoiner.toString());
    }
    

    输出:

    hello,guys,欢迎关注公众号Java技术栈

    可以看到,这样写十分的干净清爽,也省去了许多没有必要的分隔符拼接操作,代码更优雅、只是可读性没 SB 直接拼接那么直观。

    StringJoiner 就这么简单?

    No!!!

    StringJoiner 还有其他几种用法,下面的篇幅栈长会带大家解读一下。

    StringJoiner 详细介绍

    StringJoiner 的类结构图:

    它的父类就是 Object,这些成员变量和方法都有什么用呢?

    成员变量:

    • prefix:拼接后的字符串前缀
    • delimiter:拼接时的字符串分隔符
    • suffix:拼接后的字符串后缀
    • value:拼接后的值
    • emptyValue:空值的情况,value为 null 时返回

    构造方法:

    提供了两个构造方法,一个必须带分隔符,另一个必须带分隔符、前缀、后缀,可以看了 emptyValue 默认为前缀+后缀组成。

    公开方法:

    • setEmptyValue:设置空值
    • toString:转换成 String
    • add:添加字符串
    • merge:从另一个 StringJoiner 合并
    • length:长度(包括前缀后缀)

    流式 API

    我们重点看下 add 方法源码:

    可以看到内部其实就是用的 StringBuilder 进行封装的,首次创建会先拼接前缀,后续先添加分隔符,再添加字符串。

    其实 String 底层也是用的 StringBuilder,具体可以关注公众号Java技术栈在 Java 核心技术系列专栏中进行阅读。

    另外一点,add 方法就是返回 StringJoiner 本身,所以可以像 StringBuilder/ StringBuffer 一样进行流式处理。

    如上面的示例一行代码搞定:

    public static void main(String[] args) {
    	StringJoiner stringJoiner = new StringJoiner(",").add("hello").add("guys").add("欢迎关注公众号Java技术栈");
    	System.out.println(stringJoiner.toString());
    }
    

    前后缀拼接

    在示例中需要指定前后缀:

    public static void main(String[] args) {
    	StringJoiner stringJoiner = new StringJoiner(",", "[", "]");
    	stringJoiner.add("hello");
    	stringJoiner.add("guys");
    	stringJoiner.add("欢迎关注公众号Java技术栈");
    	System.out.println(stringJoiner.toString());
    }
    

    输出:

    [hello,guys,欢迎关注公众号Java技术栈]

    如上所示,前后都带中括号进行了包装。

    空值处理

    没有拼接任何字符串的几个空值处理场景。

    输出空白字符串:

    public static void main(String[] args) {
    	StringJoiner stringJoiner = new StringJoiner(",");
    	System.out.println(stringJoiner.toString());
    }
    

    输出前后缀:

    public static void main(String[] args) {
    	StringJoiner stringJoiner = new StringJoiner(",", "[", "]");
    }
    

    输出:

    []

    输出指定字符串:

    通过 setEmptyValue 进行设置。

    public static void main(String[] args) {
    	StringJoiner stringJoiner = new StringJoiner(",", "[", "]");
    	stringJoiner.setEmptyValue("void");
    	System.out.println(stringJoiner.toString());
    }
    

    输出:

    void

    String.join()

    String.join() 这是针对 StringJoiner 又封装了一层的 API,同样出自 Java 8,可以传入动态参数或者迭代器。

    • java.lang.String#join(java.lang.CharSequence, java.lang.CharSequence...)
    • java.lang.String#join(java.lang.CharSequence, java.lang.Iterable<? extends java.lang.CharSequence>)

    源码如下:

    看源码,这两个方法只能进行简单的拼接操作,不能添加前后缀、空值设置处理等。

    来个示例:

    public static void main(String[] args) {
    	String str = String.join(",", "hello", "guys", "欢迎关注公众号Java技术栈");
    	System.out.println(str);
    }
    

    可以看到,简单处理这样使用更简便。

    总结

    今天介绍了 StringJoiner、StringBuilder、String.join() 之间的关系及使用。在使用拼间多个相同的分隔符时,使用 StringJoiner,简单处理使用 String.join() 也能完成。

    针对不同的场景使用不同的 API,这才是最佳最优雅的处理方式,不要只会使用 StringBuilder!

    这是 Java 8 系列的第 ? 篇文章了?栈长我也记不清了 ,但绝对不是最后一篇,看往期新特性教程在公众号Java技术栈回复新特性即可。

    去我的博客网站也可以看往期系列教程:

    http://www.javastack.cn/

    最后,希望对大家有帮助,后面我会继续分享好玩的 Java 技术,关注公众号第一时间推送。

    觉得有用,三连走起哦~

    版权申明:本文系公众号 "Java技术栈" 原创,原创实属不易,转载、引用本文内容请注明出处,禁止抄袭、洗稿,请自重,尊重他人劳动成果和知识产权。

    近期热文推荐:

    1.Java 15 正式发布, 14 个新特性,刷新你的认知!!

    2.终于靠开源项目弄到 IntelliJ IDEA 激活码了,真香!

    3.我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。

    4.吊打 Tomcat ,Undertow 性能很炸!!

    5.《Java开发手册(嵩山版)》最新发布,速速下载!

    觉得不错,别忘了随手点赞+转发哦!

  • 相关阅读:
    大型网站的数据库分割问题。
    大型网站的数据库分割问题。
    分布式集群的Session问题
    大型网站架构设计摘要
    大型网站的架构概要
    公司产品的优势
    java.util.concurrent 学习笔记(2) 线程池基础
    《Java 7 并发编程指南》学习概要 (6) Fork/Join
    《Java 7 并发编程指南》学习概要 (5) 线程池
    《Java 7 并发编程指南》学习概要 (4) 并发集合
  • 原文地址:https://www.cnblogs.com/javastack/p/13998606.html
Copyright © 2020-2023  润新知