StringJoiner使用详解

夙愿已清 提交于 2020-02-09 00:05:09

StringJoiner是java.util包下的一个工具类,jdk1.8出来的

作用是在构造字符串时,可以自动添加前缀、后缀及分隔符,而不需要自己去实现这些添加字符的逻辑

先看一个简单的demo

StringJoiner sj1 = new StringJoiner(",");
StringJoiner sj2 = new StringJoiner(",", "[", "]");

System.out.println(sj1.add("a").add("b").add("c"));
System.out.println(sj2.add("a").add("b").add("c"));
System.out.println(sj1.merge(sj2));
System.out.println(sj2.merge(sj1));
System.out.println(sj1.length());

image-20200208234335412

StringJoiner有两个构造方法

  1. 只传入分隔符

    public StringJoiner(CharSequence delimiter) {
        // 这里只是调用了第二个构造方法,前缀和后缀传入空字符串,表示没有前后缀
        this(delimiter, "", "");
    }
  2. 传入分隔符,还有前缀和后缀

    public StringJoiner(CharSequence delimiter,
                        CharSequence prefix,
                        CharSequence suffix) {
        // 做了以下判断,如果分隔符,前后缀为null,则抛出NullPointerException异常
        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");
    
     // 赋值给当前对象的属性
        this.prefix = prefix.toString();
        this.delimiter = delimiter.toString();
        this.suffix = suffix.toString();
        this.emptyValue = this.prefix + this.suffix;
    }

成员属性,其实StringJoiner主要是通过维护了一个StringBuilder对象value去添加元素的

// 当前StringJoiner对象前缀
private final String prefix;
// 每个添加元素的分隔符
private final String delimiter;
// 当前StringJoiner对象后缀
private final String suffix;
// 前缀+元素+分隔符+后缀的值,如果没有添加元素,那么value是null
private StringBuilder value;
// 前缀+后缀的值,如果没有前后缀,那么这个值为空字符串,可以理解为value的副本,在value为null时,用它来代替
private String emptyValue;

方法描述及源码分析

  • public StringJoiner add(CharSequence newElement):添加一个元素,初始化value的工作也是在这里做的,如果当前StringJoiner没有调用过一次add方法,那么value为null

    public StringJoiner add(CharSequence newElement) {
        // 在此调用prepareBuilder方法,prepareBuilder会自动判断value是否已经初始化,并添加好分隔符
        prepareBuilder().append(newElement);
        return this;
    }
  • private StringBuilder prepareBuilder():在调用add方法时会自动调用,判断value是否为null,如果不为null,直接添加分隔符。如果为null,构造一个StringBuilder对象,初始值为prefix。

    private StringBuilder prepareBuilder() {
        // 如果不为null,在添加元素前添加分隔符
        if (value != null) {
            value.append(delimiter);
        } else {
            // 反之,构建StringBuilder对象,初始值为prefix
            value = new StringBuilder().append(prefix);
        }
        return value;
    }
  • public StringJoiner merge(StringJoiner other):合并一个StringJoiner对象到当前StringJoiner对象

    public StringJoiner merge(StringJoiner other) {
        Objects.requireNonNull(other);
        if (other.value != null) {
            final int length = other.value.length();
            StringBuilder builder = prepareBuilder();
              // 将传过来的StringJoiner对象拼接到末尾
            builder.append(other.value, other.prefix.length(), length);
        }
        return this;
    }
  • public int length():如果value不为null,当前值=value的长度+suffix的长度,如果为null,返回emptyValue的长度

    public int length() {
        // 如果value为null,返回emptyValue的长度,反之返回value的长度
        return (value != null ? value.length() + suffix.length() :
                emptyValue.length());
    }
  • public String toString():如果value不为null,返回value+suffix的值,如果为null,返回emptyValue

    @Override
    public String toString() {
        // value为null用emptyValue来代替
        if (value == null) {
            return emptyValue;
        } else {
            // 没有后缀直接返回value字符串
            if (suffix.equals("")) {
                return value.toString();
            } else {
                // 有后缀需要在toString里面再补上,把当前对象作为字符串使用时,toString方法会自动调用
                int initialLength = value.length();
                String result = value.append(suffix).toString();
                // reset value to pre-append initialLength
                value.setLength(initialLength);
                return result;
            }
        }
    }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!