JAVA8之StringJoiner
2024-09-07 23:51:53
作用:运用了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
最新文章
- 08. Web大前端时代之:HTML5+CSS3入门系列~H5 Web存储
- SharePoint 2013 Excel Services ECMAScript 示例之明日限行
- 【思路】-URL重写
- JS实现登陆验证的主要代码及思路
- .NET Framework源码查看及下载
- 电话激活windows server 2012的解决方案
- 一张表有三个字段:id(城市id) Cityname(城市名) Privence(所属省份)如果要统计每个省份有多少城市请用SQL实现。
- 企业SAAS的春天,将以手机应用的形式,即将到来
- 使用PetaPoco结合注入实现业务级事务
- wps使用积累
- React实例----一个表单验证比较复杂的页面
- zepto.js介绍
- Linux内存管理 (8)malloc
- vgcreate语法
- Z30云台PC控制问题
- excel技巧--批量生成工资条
- linux利用命令将一个盘上的所有复制到另一个盘上
- oracle 操作,偶尔记一下
- java虚拟机加载系统环境变量到内存中
- 自动化测试--响应请求测试(.net)
热门文章
- 原生PHP和MYSQL练习登陆验证和查询数据到表格
- SQL Server 中怎么查看一个字母的ascii编码或者Unicode编码(转载)
- 使用AspectCore实现AOP模式的Redis缓存
- Asp.Net MVC 的19个管道事件
- Java内功心法,深入解析面向对象
- Java编程基础——流程控制
- Arduino leonardo+esp8266-01作服务端与APP进行数据通信
- VMware虚拟机可与Win10物理机互ping并可访问互联网的设置方法
- Windows出现“引用账户被锁定,且暂时无法登录”解决方法
- Linux /proc/$pid部分内容详解【转】