出发地:霍利斯(微信号:霍利舒昂)
在文章《阿里巴巴为什么不建议在for循环中使用“+”进行字符串拼接》中,我们介绍了Java中字符串拼接的几种方法,以及它们的优缺点。还有一个我没有介绍的重要的拼接方法,就是Java 8中提供的StringJoiner。本文将介绍这种字符串拼接的新成员。
如果你想知道字符串拼接可以用多少种方法,我教你一个简单的方法。在Intellij IDEA中,定义一个Java Bean,然后尝试使用快捷键自动生成一个toString方法。IDEA会提示多种toString生成策略可供选择。
目前我使用的IDEA的toString生成策略是默认使用JDK 1.8提供的StringJoiner。
一个
介绍
StringJoiner是java.util包中的一个类,用来构造一个由分隔符分隔的字符序列(可选),可以以提供的前缀开始,以提供的后缀结束。
虽然这也可以通过在StringBuilder类的帮助下在每个字符串后面附加一个分隔符来实现,但StringJoiner提供了一种简单的方法来实现这一点,而无需编写大量代码。
StringJoiner类有两个构造函数和五个公共方法。最常用的方法是add方法和toString方法,类似于StringBuilder中的append方法和toString方法。
2
使用
StringJoiner的用法比较简单。在下面的代码中,我们使用StringJoiner来拼接字符串。
publicclassStringJoinerTest {
public static void main(String[]args){
StringJoiner SJ = NewStringjoiner(" Hollis ");
SJ . add(" hollishuang ");
Sj.add("Java干货");
system . out . println(SJ . tostring());
StringJoiner sj1 = NewStringjoiner(":","[","]");
Sj1.add ("Hollis ")。添加(“霍利斯·庄”)。加(" Java干货");
system . out . println(sj1 . ToString());
}
}
上述代码的输出结果:
HollischuangHollisJava干货
【霍利斯:霍利舒昂:Java干货】
值得注意的是,当我们使用StringJoiner(字符序列分隔符)初始化一个String Joiner时,这个分隔符实际上是一个分隔符,而不是一个变量字符串的初始值。
字符串连接符的第二个和第三个参数(字符序列分隔符、字符序列前缀、字符序列后缀)分别是拼接字符串的前缀和后缀。
三
原理
在介绍了简单的用法之后,让我们来看看这个StringJoiner的原理,看看它是如何实现的。主要看添加方法:
public string joiner add(CharSequence NewElement){
prepareBuilder()。追加(NewElement);
returnthis
}
privateStringBuilder prepareBuilder(){
if(value!= null) {
value.append(分隔符);
} else{
value= newStringBuilder()。追加(前缀);
}
returnvalue
}
我看到了一个熟悉的身影——StringBuilder。是的,StringJoiner实际上是由StringBuilder实现的。我们在为什么阿里巴巴不建议在for循环中使用“+”进行字符串拼接中介绍了StringBuilder的实现原理,这里就不赘述了。
当我们发现StringJoiner实际上是由StringBuilder实现的时候,大概可以猜到StringJoiner的性能损失应该和直接使用StringBuilder差不多!
你为什么需要字符串连接器
了解了StringJoiner的用法和原理后,很多读者可能会有一个疑问,明明已经有了StringBuilder,为什么还要在Java 8中定义StringJoiner?有什么好处?
如果读者对Java 8足够了解的话,或许可以大致猜到,这肯定和Stream有关。
作者也在Java doc中找到了答案:
一个字符串连接程序可以用来从一个流中创建格式化的输出
想象一下,在Java中,如果我们有这样一个列表:
列表<。字符串>List =不可变列表。的(“霍利斯”、“霍利斯·庄”、“爪哇干货”);
如果我们想把它拼接成以下形式的字符串:
霍利斯,霍利舒昂,爪哇干货
可以通过以下方式完成:
StringBuilder builder = NewStringBuilder();
if(!list.isEmpty()) {
builder . append(list . get(0));
for(inti = 1,n = list . size();i <。n;i++) {
builder.append(",")。append(list . get(I));
}
}
builder . tostring();
您也可以使用:
list.stream()。reduce(newStringBuilder(),(sb,s)-& gt;附加某人。追加(','),StringBuilder::append)。toString();
但是,输出结果略有不同,需要二次处理:
霍利斯,霍利舒昂,爪哇干货,
您也可以使用“+”来拼接:
list.stream()。减少((a,b)->a +","+ b)。toString();
以上方法要么代码复杂,性能低下,要么无法直接得到想要的结果。
为了满足这样的需求,Java 8中提供的StringJoiner就派上了用场。上述要求只需要一行代码:
list.stream()。收集(收集器.连接(":"))
动手吧。在上面使用的表达式中,收集器连接的源代码如下:
publicationstaticcollector & lt。CharSequence,?,字符串>;连接(字符序列分隔符、字符序列前缀、字符序列后缀){
returnnewCollectorImpl & lt>。(
()->;新字符串连接符(分隔符、前缀、后缀),
StringJoiner::add,StringJoiner::merge,
StringJoiner::toString,CH _ NOID);
}
Collector.joining的实现原理是使用StringJoiner。
当然,也许在Collector中直接使用StringBuilder看起来可以达到类似的功能,但是有点麻烦。因此,Java 8中提供了StringJoiner来丰富Stream的用法。
而StringJoiner可以轻松添加前缀和后缀。例如,如果我们想要的字符串是“[Hollis,hollschuang,Java干货]”而不是“Hollis,hollschuang,Java干货”,那么StringJoiner的优势就会更加明显。
四
总结
介绍了Java 8-String joiner中提供的可变字符串类,可用于字符串拼接。
StringJoiner实际上是由StringBuilder实现的,所以性能类似于StringBuilder,而且是非线程安全的。
如果日常开发需要字符串拼接,如何选择?
1.如果只是简单的字符串拼接,可以考虑直接使用“+”。
2.如果字符串是在for循环中拼接的,可以考虑使用StringBuilder和StringBuffer。
3.如果字符串是通过集合(如列表)拼接的,可以考虑使用StringJoiner。
4.如果一组数据被拼接,它可以被转换成流并由StringJoiner处理。
●数字917,直接输入本文的数字
1.《字符串拼接 字符串拼接新姿势:StringJoiner》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《字符串拼接 字符串拼接新姿势:StringJoiner》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/guoji/1051366.html