StringBuilder?试试StringJoiner使用

难道拼接字符串还在用StringBuilder/StringBuffer嘛?

如果需要拼接分隔符的字符串,我使用Java8->StringJoiner。

StringJoiner的基本使用

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

hello,你根本不知道我有多害怕,耶

这种三段式由","分割的字符串,在Java8之前都会去使用StringBuilder/StringBuffer进行拼接,如:

StringBuilder sb = new StringBuilder();
sb.append("hello");
sb.append(",");
sb.append("你根本不知道我有多害怕");
sb.append(",");
sb.append("耶");
String str = sb.toString();

都是相同的分割符逗号,如果要拼接的字符串过多,代码会十分不整洁;

Java8之后有StringJoiner,这件事情变得简单,分割符这种全部一次性交给StringJoiner即可。

StringJoiner基本使用示例:

public static void main(String[] args) {
 StringJoiner stringJoiner = new StringJoiner(",");
 stringJoiner.add("hello");
 stringJoiner.add("你根本不知道我有多害怕");
 stringJoiner.add("耶");
 System.out.println(stringJoiner.toString());
}

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

StringJoiner详细介绍

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

成员变量:

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

够造方法:

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;
    }

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

公开方法:

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

流式API

add方法源码:

public StringJoiner add(CharSequence newElement) {
        prepareBuilder().append(newElement);
        return this;
    }
private StringBuilder prepareBuilder() {
        if (value != null) {
            value.append(delimiter);
        } else {
            value = new StringBuilder().append(prefix);
        }
        return value;
    }

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

如上面的示例一行代码解决:


public static void main(String[] args) {
 StringJoiner stringJoiner = new StringJoiner(",").add("hello").add("你跟本不知道我有多害怕").add("耶");
 System.out.println(stringJoiner.toString());
}

前后缀拼接:

public static void main(String[] args) {
 StringJoiner stringJoiner = new StringJoiner(",", "[", "]");
 stringJoiner.add("hello");
 stringJoiner.add("你根本不知道我有多害怕");
 stringJoiner.add("耶");
 System.out.println(stringJoiner.toString());
//[hello,你根本不知道我有多害怕,耶]
}

前后都带中括号进行了包装。

空值处理:

没有拼接任何字符串的几个控制场景处理

输出空白字符串

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

String.Join();

String.Join()是针对StringJoiner又封装了一层的API,可以传入动态参数或者迭代器。

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();
    }
public static String join(CharSequence delimiter,
            Iterable<? extends CharSequence> elements) {
        Objects.requireNonNull(delimiter);
        Objects.requireNonNull(elements);
        StringJoiner joiner = new StringJoiner(delimiter);
        for (CharSequence cs: elements) {
            joiner.add(cs);
        }
        return joiner.toString();
    }

这两个方法只能进行简单的拼接操作,不能添加前缀和后缀,控制设置处理等;

public static void main(String[] args) {
 String str = String.join(",", "hello", "你根本不知道我有多害怕", "耶");
 System.out.println(str);
}

总结:

了解StringJoiner,StringBuilder,String.Join()之间的关系及使用,在使用拼接多个相同的分隔符,使用StringJoiner,简单处理使用String.Join();

不同场景使用不同API;

我的博客网站也可以看往期发布博文:https://wzdhhp.blog.csdn.net/

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值