Java实用工具之StringJoiner详解

 更新时间:2021年05月11日 17:22:59   作者:黄智霖-blog  
这篇文章主要介绍了Java实用工具之StringJoiner详解,文中有非常详细的代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下

背景

在平时的业务开发中,我们可能会遇到字符串列表根据分隔符进行拼接的需求。比如:

输入:

数组:[“a”,“b”,“c”]分隔符:","

输出:

“a,b,c”

处理

通常我们可以使用StringBuilder根据下标位置决定是否需要添加分隔符以达到目的,比如:

public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        String[] strings = new String[]{"a", "b", "c"};
        String delimiter = ",";
        for (int i = 0; i < strings.length; i++) {
            if (i != 0) {
                sb.append(delimiter);
            }
            sb.append(strings[i]);
        }
        System.out.println(sb.toString());
    }

或者:

public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        String[] strings = new String[]{"a", "b", "c"};
        String delimiter = ",";
        int tmp = strings.length - 1;
        for (int i = 0; i < strings.length; i++) {
            sb.append(strings[i]);
            if (i != tmp) {
                sb.append(delimiter);
            }
        }
        System.out.println(sb.toString());
    }

但是每次遇到这种情况都去这样拼接很麻烦,而且如果使用迭代器,没有下标就不能使用这种方法。那么就每次append分隔符,最后再截断:

public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        String[] strings = new String[]{"a", "b", "c"};
        String delimiter = ",";
        for (String str:strings) {
            sb.append(str).append(delimiter);
        }
        System.out.println(sb.substring(0,sb.length()-1));
    }

所以通常情况下,我们都会去扩展一个StringBuilder以提供分隔符组装的功能,博主平时是这样弄的:

public class MyStringBuilder {
    private StringBuilder stringBuilder;
    private String delimiter;

    public MyStringBuilder(String delimiter) {
        this.delimiter = delimiter;
    }

    public MyStringBuilder append(String item) {
        getStringBuilder().append(item);
        return this;
    }

    /**
     * 模拟的就是这个逻辑:
     * if(index != 0){
     *   append(delimiter);
     * }
     * append(str);
     *
     * @return
     */
    private StringBuilder getStringBuilder() {
        if (stringBuilder == null) {
            //相当于index==0,
            stringBuilder = new StringBuilder();
        } else {
            stringBuilder.append(delimiter);
        }
        return stringBuilder;
    }

    @Override
    public String toString() {
        return stringBuilder == null ? "" : stringBuilder.toString();
    }
}

在初始化的时候指定分隔符,然后每次直接append就行了,由内部决定在何时添加分隔符。
在JDK1.8之后,提供了一个StringJoiner类,提供了类似的功能,可以在初始化的时候指定分隔符和前缀后缀:

StringJoiner sj = new StringJoiner(",","(",")");
sj.add("a").add("b").add("c");
System.out.println(sj.toString());
//输出:(a,b,c)

博主大致看了一下StringJoiner的实现逻辑,很简单,和咱们扩展StringBuilder基本是一样的逻辑,另外加入了前缀后缀,然后多了一个merge的功能:

public StringJoiner merge(StringJoiner other) {
        Objects.requireNonNull(other);
        if (other.value != null) {
            final int length = other.value.length();
            // lock the length so that we can seize the data to be appended
            // before initiate copying to avoid interference, especially when
            // merge 'this'
            StringBuilder builder = prepareBuilder();
            builder.append(other.value, other.prefix.length(), length);
        }
        return this;
    }

到此这篇关于Java实用工具之StringJoiner详解的文章就介绍到这了,更多相关Java StringJoiner内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java数据结构与算法之noDups去除重复项算法示例

    java数据结构与算法之noDups去除重复项算法示例

    这篇文章主要介绍了java数据结构与算法之noDups去除重复项算法实现技巧,程序代码非常简单,关键在于循环与判定,需要的朋友可以参考下
    2016-08-08
  • Java基础之数组的初始化过程

    Java基础之数组的初始化过程

    Java数组分为静态和动态初始化,静态初始化中,程序员设定元素初始值,系统决定长度;动态初始化中,程序员设定长度,系统提供初始值,数组初始化后长度固定,存储在堆内存中,数组变量在栈内存指向堆内存数组对象,基本类型数组存储数据值,引用类型数组存储对象引用
    2024-10-10
  • java递归算法的实例详解

    java递归算法的实例详解

    在本篇文章里小编给大家整理了关于java递归算法的实例内容,以及相关知识点总结,需要的朋友们可以学习下。
    2020-02-02
  • Java如何利用CompletableFuture描述任务之间的关系

    Java如何利用CompletableFuture描述任务之间的关系

    Java如何根据线程的执行结果执行下一步动作呢,Future的另一个实现类CompletableFuture能够优雅的解决异步化问题,下面就跟随小编一起了解一下吧
    2023-07-07
  • Mybatis-plus批量去重插入ON DUPLICATE key update使用方式

    Mybatis-plus批量去重插入ON DUPLICATE key update使用方式

    这篇文章主要介绍了Mybatis-plus批量去重插入ON DUPLICATE key update使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java类加载器ClassLoader用法解析

    Java类加载器ClassLoader用法解析

    这篇文章主要介绍了Java类加载器ClassLoader用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 使用mybatis-plus分页出现两个Limit的问题解决

    使用mybatis-plus分页出现两个Limit的问题解决

    在使用MyBatis-Plus进行分页查询时,可能会遇到查询SQL中出现两个limit语句的问题,这通常是由于在多个模块中重复引入了MyBatis-Plus的分页插件所导致的,下面就来介绍一下如何解决,感兴趣的可以了解一下
    2024-10-10
  • Java Lambda表达式和函数式接口实例分析

    Java Lambda表达式和函数式接口实例分析

    这篇文章主要介绍了Java Lambda表达式和函数式接口,结合实例形式分析了Java8 Lambda表达式和函数式接口相关原理、用法及操作注意事项,需要的朋友可以参考下
    2019-09-09
  • JAVA递归生成树形菜单的实现过程

    JAVA递归生成树形菜单的实现过程

    这篇文章主要介绍了JAVA递归生成树形菜单,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • Spring中的refreshContext源码分析

    Spring中的refreshContext源码分析

    这篇文章主要介绍了Spring中的refreshContext源码分析,在SpringBoot启动流程中,主要的两个阶段是初始化SpringApplication对象以及SpringApplication.run方法执行的内容,今天主要细讲的是SpringApplication.run中的刷新容器refreshContext方法,需要的朋友可以参考下
    2023-12-12

最新评论