作用:运用了StringBuilder的一个拼接字符串的封装处理

示例:

StringJoiner sj = new StringJoiner("-", "[", "]");
sj.add("name").add("kevin").add("cool");
String result = sj.toString();
输出:[name-kevin-cool]

源码分析:

public final class StringJoiner {
private final String prefix;//前缀
private final String delimiter;//间隔符
private final String suffix;//后缀
private StringBuilder value;//值 private String emptyValue;//空值 public StringJoiner(CharSequence delimiter) {
this(delimiter, "", "");//默认前缀和后缀为"",重载调用
} public StringJoiner(CharSequence delimiter,
CharSequence prefix,
CharSequence suffix) {
//间隔符,前缀和后缀判断是否为null,null将抛出异常
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;//空值被设置为只有前后缀
}
//设置空值,检查是否为null
public StringJoiner setEmptyValue(CharSequence emptyValue) {
this.emptyValue = Objects.requireNonNull(emptyValue,
"The empty value must not be null").toString();
return this;
} @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;
}
}
}
////初始化,先添加前缀,有了之后每次先添加间隔符,StringBuilder后续append字符串
public StringJoiner add(CharSequence newElement) {
prepareBuilder().append(newElement);
return this;
}
//合并StringJoiner,注意后面StringJoiner 的前缀就不要了,后面的appen进来
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;
}
//初始化,先添加前缀,有了之后每次先添加间隔符
private StringBuilder prepareBuilder() {
if (value != null) {
value.append(delimiter);
} else {
value = new StringBuilder().append(prefix);
}
return value;
} 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());
}
}

使用注意:

如下场景:
StringJoiner sj = new StringJoiner("-");
sj.add("1");
sj.add(null);
System.out.println(sj.toString());
输出:1-null

最新文章

  1. 08. Web大前端时代之:HTML5+CSS3入门系列~H5 Web存储
  2. SharePoint 2013 Excel Services ECMAScript 示例之明日限行
  3. 【思路】-URL重写
  4. JS实现登陆验证的主要代码及思路
  5. .NET Framework源码查看及下载
  6. 电话激活windows server 2012的解决方案
  7. 一张表有三个字段:id(城市id) Cityname(城市名) Privence(所属省份)如果要统计每个省份有多少城市请用SQL实现。
  8. 企业SAAS的春天,将以手机应用的形式,即将到来
  9. 使用PetaPoco结合注入实现业务级事务
  10. wps使用积累
  11. React实例----一个表单验证比较复杂的页面
  12. zepto.js介绍
  13. Linux内存管理 (8)malloc
  14. vgcreate语法
  15. Z30云台PC控制问题
  16. excel技巧--批量生成工资条
  17. linux利用命令将一个盘上的所有复制到另一个盘上
  18. oracle 操作,偶尔记一下
  19. java虚拟机加载系统环境变量到内存中
  20. 自动化测试--响应请求测试(.net)

热门文章

  1. 原生PHP和MYSQL练习登陆验证和查询数据到表格
  2. SQL Server 中怎么查看一个字母的ascii编码或者Unicode编码(转载)
  3. 使用AspectCore实现AOP模式的Redis缓存
  4. Asp.Net MVC 的19个管道事件
  5. Java内功心法,深入解析面向对象
  6. Java编程基础——流程控制
  7. Arduino leonardo+esp8266-01作服务端与APP进行数据通信
  8. VMware虚拟机可与Win10物理机互ping并可访问互联网的设置方法
  9. Windows出现“引用账户被锁定,且暂时无法登录”解决方法
  10. Linux /proc/$pid部分内容详解【转】