StringJoiner更优雅创建含分隔符的字符序列

  本文目标:开发人员,在了解JDK8的StringJoiner特性的条件下,进行更简介的字符串拼接操作,达到简化代码的程度。

1 why

  StringBuilder拼接包含分隔符的字符序列时,分隔符需要一个一个添加,或者需要手动删除末尾冗余的分隔符,代码不美观,不好看。

  比如,单个字符串依次拼接时:

StringBuilder sb = new StringBuilder();
sb.append("apple");
sb.append(",");
sb.append("orange");
sb.append(",");
sb.append("milk");
String str = sb.toString();

  以及字符串集合循环拼接时:

StringBuilder sb = new StringBuilder();
for (String s:foodList) {
    sb.append(s);
    sb.append(",");
}
sb.deleteCharAt(sb.length()-1);
String str = sb.toString();

  StringJoiner很好的解决了这个问题。

2 what

  StringJoiner:用于构造由分隔符分隔的字符序列,并且可选前缀、后缀。内部实际是基于StringBuilder实现。

  由于本文只使用StringJoiner替换StringBuilder,生成带分隔符的字符序列,所以与之无关的功能不介绍,详情可以参见jdk1.8官网手册。

StringJoiner功能
  如图,需要用到的有StringJoiner本身提供的StringJoiner构造方法、add方法、toString方法,以及String类中通过StringJoiner实现的join方法。

  (1)StringJoiner构造方法

public StringJoiner(CharSequence delimiter) {
    this(delimiter, "", "");
}

  创建对象时,可以指定分隔符。

  (2)add方法

public StringJoiner add(CharSequence newElement) {
    prepareBuilder().append(newElement);
    return this;
}

  外层使用的prepareBuilder()方法,及StringBuilder的append方法,继续查看prepareBuilder方法:

private StringBuilder prepareBuilder() {
    if (value != null) {
        value.append(delimiter);
    } else {
        value = new StringBuilder().append(prefix);
    }
    return value;
}

  也是用的StringBuilder的append方法,区别是增加了prefix(前缀,用于在输出的字符序列最前面添加用户自定义的字符,比如[)。

  (3)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;
        }
    }
}

(4)String类的join方法

public static String join(CharSequence delimiter, CharSequence... elements) {
    Objects.requireNonNull(delimiter);
    Objects.requireNonNull(elements);
    // Number of elements not likely worth Arrays.stream overhead.
    StringJoiner joiner = new StringJoiner(delimiter);
    for (CharSequence cs: elements) {
        joiner.add(cs);
    }
    return joiner.toString();
}

  可以看到实际是调用StringJoiner实现的。

  此处,实现了suffix(分隔符)的填充操作。

  至此介绍完毕相关功能,后面进行尝试。

3 how

  (1)单个字符串依次拼接时:

  简单字符,可直接使用String类的join方法。

String result = String.join(",", "aaa", "bbb" ,"ccc");

  第一个入参是分隔符,后面依次添加要追加的字符串。

  字符串内容复杂时,使用StringJoiner。

StringJoiner sj = new StringJoiner(",");
sj.add("apple");
sj.add("orange");
sj.add("milk");
String str = sj.toString();

  (2)字符串集合循环拼接时:

List<String> foodList = new ArrayList<String>();
foodList.add("apple");
foodList.add("orange");
foodList.add("milk");

StringJoiner sj = new StringJoiner(",");
for (String s:foodList) {
    sj.add(s);
}
String str = sj.toString();

  和一开始StringBuilder的方式比较下,是不是简洁许多?

4 练习手段

  可以参照“3 how”章节,尝试在自己的项目中,替换原本使用StringBuilder生成包含分隔符的字符序列功能。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值