如何做印刷报价网站,淘宝客网站建站,私人订制网站有哪些,wordpress企业新闻关于StringJoiner 1.介绍2.源码2.1 属性2.2 方法 3 举例StringJoiner做法3.1 只含间隔符3.2 含间隔符和前后缀3.3 merge合并两个joiner3.4 stringJoiner.setEmptyValue(xxx);3.5 综合举例length()方法 1.介绍 在JDK1.8之后#xff0c;提供了一个StringJoiner类用来… 关于StringJoiner 1.介绍2.源码2.1 属性2.2 方法 3 举例StringJoiner做法3.1 只含间隔符3.2 含间隔符和前后缀3.3 merge合并两个joiner3.4 stringJoiner.setEmptyValue(xxx);3.5 综合举例length()方法 1.介绍 在JDK1.8之后提供了一个StringJoiner类用来进行字符串拼接处理其可以在初始化的时候指定分隔符和前缀后缀 实现逻辑和StringBuilder基本是一样的逻辑另外加入了前缀后缀、多了一个merge的功能 作用处理字符串拼接的工具类 好处比StringBuilder和StringBuffer更加方便、便捷、优雅
2.源码
源码
package java.util;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) {//间隔符前缀和后缀判断是否为nullnull将抛出异常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;//空值被设置为只有前后缀}//设置空值检查是否为nullpublic StringJoiner setEmptyValue(CharSequence emptyValue) {this.emptyValue Objects.requireNonNull(emptyValue,The empty value must not be null).toString();return this;}
--toString()方法Overridepublic 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 initialLengthvalue.setLength(initialLength);return result;}}}
--add元素开始进行初始化先添加前缀有了之后每次先添加间隔符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 thisStringBuilder 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());}
}2.1 属性
prefix拼接后的字符串前缀delimiter拼接时的字符串分隔符suffix拼接后的字符串后缀value拼接后的值emptyValue空值的情况value为null时返回
2.2 方法
setEmptyValue()设置空值toString()转换成Stringadd()添加字符串merge():从另一个StringJoiner合并length()长度包括前后缀
3 举例
举例把一个字符串集合使用 “ ”逗号分隔开先看之前的StringBuilder做法
# StringBuilder做法
String a a, b b, c c;
ListString list new ArrayList();
list.add(a);
list.add(b);
list.add(c);
String s
StringBuilder builder new StringBuilder();
list.forEach(s - builder.append(s).append(,));
// 最后在处理掉多余的,
System.out.println(builder.toString().substring(0, builder.length() - 1));
// 输出结果a,b,cStringJoiner做法 参数不同使用不同调用的构造函数不同呈现的用法不同 3.1 只含间隔符
StringJoiner stringJoinernew StringJoiner(,把字符串根据“,”进行拼接
stringJoiner.add(a);
stringJoiner.add(b);
stringJoiner.add(c);
System.out.println(stringJoiner);//a,b,c3.2 含间隔符和前后缀
StringJoiner stringJoinernew StringJoiner(,,[,]); 字符串 根据, 拼接并且用 [ 和 ] 包住首尾
stringJoiner.add(a);
stringJoiner.add(b);
stringJoiner.add(c);
System.out.println(stringJoiner);//[a,b,c]3.3 merge合并两个joiner merge的思路是用当前的stringJoiner去append other的value,merge时去掉前后缀只进行value的拼接 merger后加上前后缀比如A merge B那么最后就加上A的前后缀且进行value拼接的时候连接A和B使用的是A的拼接符 StringJoiner stringJoiner1new StringJoiner(:,[,]);
StringJoiner stringJoiner2new StringJoiner(.,(,));
stringJoiner1.add(a).add(b).add(c);
stringJoiner2.add(d).add(e).add(f);
System.out.println(stringJoiner1);//[a:b:c]
System.out.println(stringJoiner2);//(d.e.f)
stringJoiner1.merge(stringJoiner2);//[a:b:c:d.e.f]3.4 stringJoiner.setEmptyValue(“xxx”); 设置空值目的我们在源码中可以看出在无拼接元素的时候也就是valu为空时返回的是这个emptyValue的值/长度 3.5 综合举例length()方法
StringJoiner stringJoiner1new StringJoiner(:,[,]);
StringJoiner stringJoiner3new StringJoiner(*);
--无元素拼接 含前后缀
System.out.println(stringJoiner1.length());//2(前后缀长度)
System.out.println(stringJoiner1);//[]
--无元素拼接 只含间隔符
System.out.println(stringJoiner3.length());//0(无元素拼接时间隔符不算前后缀算)
System.out.println(stringJoiner3);//空什么也没有
--加上元素拼接
stringJoiner1.add(a).add(b);
System.out.println(stringJoiner1.length());//5
System.out.println(stringJoiner1);//[a:b]
--设置emptyValue 此时stringjoiner3无元素拼接再设置emptyValue后返回的是empty的长度和值
stringJoiner3.setEmptyValue(123456);
System.out.println(stringJoiner3.length());//6
System.out.println(stringJoiner3);//123456