你只会用 StringBuilder?试试 StringJoiner,真香!

简介: 你只会用 StringBuilder/ StringBuffer 拼接字符串?那你就 OUT 了!!如果需要拼接分隔符的字符串,建议使用 Java 8 中的这款拼接神器:StringJoiner,你值得拥有。StringJoiner 基本使用字面上理解就是用来拼接字符串的,一般需要分隔符进行拼接,如:

你只会用 StringBuilder/ StringBuffer 拼接字符串?


那你就 OUT 了!!


如果需要拼接分隔符的字符串,建议使用 Java 8 中的这款拼接神器:StringJoiner,你值得拥有。


StringJoiner 基本使用

字面上理解就是用来拼接字符串的,一般需要分隔符进行拼接,如:


hello, guys, 欢迎关注公众号Java技术栈


这种三段式由 "," 分隔的字符串,在 Java 8 之前要使用 StringBuilder/ StringBuffer 进行拼接,如:

StringBuilder sb = new StringBuilder();
sb.append("hello");
sb.append(",");
sb.append("guys");
sb.append(",");
sb.append("欢迎关注公众号Java技术栈");
String str = sb.toString();

都是相同的分隔符逗号,这样拼接显然过于傻瓜式,如果要拼接的字符串非常多,代码会十分难看,写完感觉要崩溃。


然而 Java 8 之后有了 StringJoiner,这件事件就变得更简单,分隔符这种全部一次性交给 StringJoiner 即可。


StringJoiner 基本使用示例:

public static void main(String[] args) {
    StringJoiner stringJoiner = new StringJoiner(",");
    stringJoiner.add("hello");
    stringJoiner.add("guys");
    stringJoiner.add("欢迎关注公众号Java技术栈");
    System.out.println(stringJoiner.toString());
}

输出:


hello,guys,欢迎关注公众号Java技术栈


可以看到,这样写十分的干净清爽,也省去了许多没有必要的分隔符拼接操作,代码更优雅、只是可读性没 SB 直接拼接那么直观。


StringJoiner 就这么简单?


No!!!


StringJoiner 还有其他几种用法,下面的篇幅栈长会带大家解读一下。


StringJoiner 详细介绍

StringJoiner 的类结构图:


image.png


它的父类就是 Object,这些成员变量和方法都有什么用呢?


成员变量:


prefix:拼接后的字符串前缀

delimiter:拼接时的字符串分隔符

suffix:拼接后的字符串后缀

value:拼接后的值

emptyValue:空值的情况,value为 null 时返回

构造方法:


image.png


提供了两个构造方法,一个必须带分隔符,另一个必须带分隔符、前缀、后缀,可以看了 emptyValue 默认为前缀+后缀组成。


公开方法:


setEmptyValue:设置空值

toString:转换成 String

add:添加字符串

merge:从另一个 StringJoiner 合并

length:长度(包括前缀后缀)

流式 API

我们重点看下 add 方法源码:



image.png



可以看到内部其实就是用的 StringBuilder 进行封装的,首次创建会先拼接前缀,后续先添加分隔符,再添加字符串。


其实 String 底层也是用的 StringBuilder,具体可以关注公众号Java技术栈在 Java 核心技术系列专栏中进行阅读。


另外一点,add 方法就是返回 StringJoiner 本身,所以可以像 StringBuilder/ StringBuffer 一样进行流式处理。


如上面的示例一行代码搞定:

public static void main(String[] args) {
    StringJoiner stringJoiner = new StringJoiner(",").add("hello").add("guys").add("欢迎关注公众号Java技术栈");
    System.out.println(stringJoiner.toString());
}

前后缀拼接

在示例中需要指定前后缀:

public static void main(String[] args) {
    StringJoiner stringJoiner = new StringJoiner(",", "[", "]");
    stringJoiner.add("hello");
    stringJoiner.add("guys");
    stringJoiner.add("欢迎关注公众号Java技术栈");
    System.out.println(stringJoiner.toString());
}

输出:

[hello,guys,欢迎关注公众号Java技术栈]

如上所示,前后都带中括号进行了包装。

空值处理

没有拼接任何字符串的几个空值处理场景。

输出空白字符串:

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());
}

输出:


void


String.join()

String.join() 这是针对 StringJoiner 又封装了一层的 API,同样出自 Java 8,可以传入动态参数或者迭代器。


java.lang.String#join(java.lang.CharSequence, java.lang.CharSequence...)

java.lang.String#join(java.lang.CharSequence, java.lang.Iterable)

源码如下:

image.png

看源码,这两个方法只能进行简单的拼接操作,不能添加前后缀、空值设置处理等。

来个示例:

public static void main(String[] args) {
    String str = String.join(",", "hello", "guys", "欢迎关注公众号Java技术栈");
    System.out.println(str);
}

可以看到,简单处理这样使用更简便。


总结

今天介绍了 StringJoiner、StringBuilder、String.join() 之间的关系及使用。在使用拼间多个相同的分隔符时,使用 StringJoiner,简单处理使用 String.join() 也能完成。


针对不同的场景使用不同的 API,这才是最佳最优雅的处理方式,不要只会使用 StringBuilder!


这是 Java 8 系列的第 ? 篇文章了?栈长我也记不清了 ,但绝对不是最后一篇,看往期新特性教程在公众号Java技术栈回复新特性即可。




相关文章
|
2月前
|
人工智能 弹性计算 自然语言处理
阿里云产品与AI产品优惠信息参考:Token Plan、万小智AI建站、AI组合购等优惠信息汇总
阿里云最新云产品与AI产品优惠信息:覆盖基础云服务器、AI大模型、编程智能体、视频生成等全链路产品。核心优惠包括:百炼全模型通用Token Plan包季低至4.5折,覆盖150+款大模型;轻量应用服务器2核2G新人专享68元/年起,e实例99元/年续费同价;Qoder CN编程智能体59元/月起,秒悟Pro版限量9.9元/月,HappyHorse视频生成限时8折,万小智AI建站赠域名与灵感值。同时搭配最高100万元OPC创新助力Token补贴,全方位降低AI落地与上云综合成本。
|
3月前
|
Prometheus 监控 Cloud Native
MySQL 性能监控实战:从零搭建 Prometheus + Grafana 监控告警体系(附排查 SOP)
数据库小学妹带你从零学监控!本文详解MySQL五大核心指标维度(资源、连接、查询、InnoDB、主从),手把手配置PMM/Prometheus+Grafana监控栈,设置关键告警规则,并提供SQL快照脚本与三步排障SOP。新手友好,即装即用,让性能问题无所遁形!
|
6月前
|
前端开发 IDE JavaScript
HBuilderX 4.2 前端开发工具安装教程:详细步骤+自定义安装路径
HBuilderX(HX)是一款专为前端开发打造的轻量级IDE,以敏捷性能、清爽界面和强大功能著称。本文详解其4.2版离线安装全流程:下载解压→复制粘贴→运行配置→创建快捷方式,快速完成本地部署,即刻投入HTML/CSS/JS开发。
|
人工智能 自然语言处理 数据可视化
AI视频培训|格律诗AI 视频创作与自媒体传播——某诗词学会
近日,TsingtaoAI派驻专家团队为某诗词学会学员交付《格律诗AI 视频创作与自媒体传播》培训。本课程精准切中行业痛点——传统诗词创作与现代传播方式的断层。课程摒弃泛泛而谈,直击实操:首日聚焦"工具认知+创作逻辑",系统梳理即梦、可灵等国产AI工具在格律诗意象可视化中的差异化应用,如将"月光在指尖碎裂"转化为动态场景;次日深入"语音表达+自媒体运营",传授用魔音工坊生成情感化配音、坤行数字人打造诗人形象的秘技,更结合抖音、小红书平台特性,解析"前5秒高光片段设计"等流量密码。
951 3
|
存储 缓存 安全
go sync.Pool 设计与实现
go sync.Pool 设计与实现
309 2
|
JavaScript 前端开发 API
网络请求库 – axios库
网络请求库 – axios库
676 60
|
JSON API 网络架构
Index alias — Elastic Stack 实战手册
别名,是为一个或多个索引而命名的第二名称,第二名称不得与集群中任何索引同名;只要把第二名称和真实索引建立绑定关系,便可以使用别名对索引进行相关的操作。
1132 0
Index alias — Elastic Stack 实战手册
|
Kubernetes 容器 Perl
在K8S中,如何查看Pod中某个容器日志?
在K8S中,如何查看Pod中某个容器日志?
|
存储 关系型数据库 MySQL
MySQL查询执行计划详解(EXPLAIN)
一、单表查询 访问方法/访问类型: • const:通过主键值或唯一二级索引与一个常熟进行等值查询(不包括NULL),只会生成一条记录 • ref:普通二级索引与一个常数进行等值比较,可能生成多条记录 • ref_or_null:ref的前提下可以加上or key is null • range:对应的扫描区间为若干个单点扫描区间或范围扫描区间(不包括负无穷到正无穷的范围) • index:扫描区间为全表,但是可以在二级索引中扫描(因为二级索引每条记录占用空间更小,所以需要读的页更少) • all:直接扫描全部的聚集索引记录