• 关于StringJoiner的使用


    在项目中,经常有某些集合数据,需要添加逗号或其他符号,拼接成字符串展示,而普通的遍历后追加分隔符,需要单独处理最后一个元素,比较繁琐.Java8中,提供了一个工具类,即StringJoiner可以完美解决此类问题.

    1 说明

    StringJoiner类, 是Java8中,java.util包下的一个类.基于StringBuilder实现.主要用于对字符串通过分隔符进行拼接的场景.

    1 属性和构造方法

    public final class StringJoiner {
        // 拼接后字符串前缀
        private final String prefix;
        // 拼接时字符串的分隔符
        private final String delimiter;
        // 拼接后字符串后缀
        private final String suffix;
        // 拼接后字符串的值
        private StringBuilder value;
        // 当value为null时,返回的值  (默认是前缀+后缀)
        private String emptyValue;
        
        // 分隔符构造
        public StringJoiner(CharSequence delimiter) {
            this(delimiter, "", "");
        }
        
        // 前缀,分隔符,后缀构造
        public StringJoiner(CharSequence delimiter,
                            CharSequence prefix,
                            CharSequence suffix) {
            Objects.requireNonNull(prefix, "The prefix must not be null");
            Objects.requireNonNull(delimiter, "The delimiter must not be null");
            Objects.requireNonNull(suffix, "The suffix must not be null");
            // make defensive copies of arguments
            this.prefix = prefix.toString();
            this.delimiter = delimiter.toString();
            this.suffix = suffix.toString();
            this.emptyValue = this.prefix + this.suffix;
        }
        
    }    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    2 普通方法

    setEmptyValue : 设置空值

    public StringJoiner setEmptyValue(CharSequence emptyValue) {
        this.emptyValue = Objects.requireNonNull(emptyValue,
            "The empty value must not be null").toString();
        return this;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    toString : 转成字符串

        @Override
        public String toString() {
            if (value == null) {
                return emptyValue;
            } else {
                if (suffix.equals("")) {
                    return value.toString();
                } else {
                    int initialLength = value.length();
                    String result = value.append(suffix).toString();
                    // reset value to pre-append initialLength
                    value.setLength(initialLength);
                    return result;
                }
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    add : 添加字符串

    public StringJoiner add(CharSequence newElement) {
        prepareBuilder().append(newElement);
        return this;
    }
    
    • 1
    • 2
    • 3
    • 4

    merge : 合并另一个StringJoiner

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    prepareBuilder : 构建准备,不存在则新增

    private StringBuilder prepareBuilder() {
        if (value != null) {
            value.append(delimiter);
        } else {
            value = new StringBuilder().append(prefix);
        }
        return value;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    length : 长度,如value为null则返回空值长度

    public int length() {
        // Remember that we never actually append the suffix unless we return
        // the full (present) value or some sub-string or length of it, so that
        // we can add on more if we need to.
        return (value != null ? value.length() + suffix.length() :
                emptyValue.length());
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2 使用

    1 单个拼接场景

    StringBuilder sb = new StringBuilder();
    sb.append("(");
    sb.append("李白");
    sb.append(",");
    sb.append("高适");
    sb.append(")");
    String str = sb.toString();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    改造后

    StringJoiner sj = new StringJoiner(",", "(", ")");
    sj.add("李白");
    sj.add("高适");
    String str = sj.toString();
    
    • 1
    • 2
    • 3
    • 4

    2 遍历拼接场景

    List<String> list = Arrays.asList("李白","高适");
    StringBuilder sb = new StringBuilder();
    for(String str: list){
        sb.append(str).append(",");
    }
    // 删除最后一个逗号返回
    // 正常需要判断sb不为空即length()大于0  
    String str = deleteCharAt(sb.length()-1).toString();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    改造后

    List<String> list = Arrays.asList("李白","高适");
    StringJoiner sj = new StringJoiner(",");
    for(String str: list){
        sj.add(str);
    }
    String str = sj.toString();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    logging的基本使用教程
    【Word自定义配置,超简单,图文并茂】自定义Word中的默认配置,比如标题大小与颜色(参考科研作图配色),正文字体等
    多模态大模型训练数据集汇总介绍
    Redis 入门和数据类型讲解
    本地客户端连接阿里云Redis服务器
    贪心算法(四) | 加油站、单调递增的数字、监控二叉树 | leecode刷题笔记
    redis未授权与权限获取
    [Servlet 1] JSP基础知识
    Pritunl搭建OpenVPN服务器详细流程,快速实现公网远程连接!
    Vue2路由的详细讲解
  • 原文地址:https://blog.csdn.net/ABestRookie/article/details/134008881