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/
本文地址:https://blog.csdn.net/qq_42464423/article/details/109896936
推荐阅读
-
字符串反转:例如键盘输入abc输出cba(不能使用StringBuilder的方法,不能逆序输出)
-
字符串反转使用StringBuilder中的方法
-
C#中StringBuilder类的使用总结
-
Java1.8中StringJoiner的使用及源码详析
-
java 中String和StringBuffer与StringBuilder的区别及使用方法
-
Java1.8中StringJoiner的使用及源码详析
-
java 中String和StringBuffer与StringBuilder的区别及使用方法
-
C#中StringBuilder类的使用总结
-
使用StringBuilder创建方法实现双色球模拟中奖功能
-
String StringBuffer StringBuilder区别和使用