在平时的业务开发中,我们可能会遇到字符串列表根据分隔符进行拼接的需求。比如:
输入:
数组:[“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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
免责声明:本站发布的内容(图片、视频和文字)以原创、来自互联网转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系QQ:712375056 进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
Copyright © 2009-2021 56dr.com. All Rights Reserved. 特网科技 特网云 版权所有 珠海市特网科技有限公司 粤ICP备16109289号
域名注册服务机构:阿里云计算有限公司(万网) 域名服务机构:烟台帝思普网络科技有限公司(DNSPod) CDN服务:阿里云计算有限公司 中国互联网举报中心 增值电信业务经营许可证B2
建议您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流浏览器浏览本网站


