StringJoiner 是 Java 8 提供的专用于字符串拼接的工具类,支持自动处理分隔符、前缀和后缀,无缝对接 Stream API,提供 merge() 合并多个拼接结果,并需注意 null 元素会抛异常而空字符串合法。

StringJoiner 是 Java 8 引入的轻量级工具类,专为拼接字符串而设计,相比 StringBuilder 手动处理分隔符、前缀和后缀,它更简洁、语义更清晰,特别适合将集合元素转为格式化字符串的场景。
自动处理分隔符与边界符号
StringJoiner 内置对分隔符(delimiter)、前缀(prefix)和后缀(suffix)的支持,无需额外判断是否为首个元素或是否为空集合:
- 构造时直接指定
new StringJoiner(",", "[", "]"),后续添加元素会自动插入逗号,并在整体前后加上方括号 - 即使集合为空,也返回
"[]";只有一个元素时,不加多余分隔符,如"[apple]" - 避免了传统循环中反复检查
isEmpty()或用标志位控制分隔符的繁琐逻辑
无缝对接 Stream API
配合 Collectors.joining()(底层即基于 StringJoiner),可一行完成集合转字符串:
list.stream().collect(Collectors.joining(", ", "[", "]"))- 支持链式转换:如
list.stream().map(Object::toString).filter(Objects::nonNull).collect(Collectors.joining("; ")) - 比手动 new StringJoiner + for-each 更函数式,也更安全(自动处理 null 元素需额外注意,但可结合 map 或 filter 过滤)
支持动态合并多个 Joiner
当需要拼接多个已有字符串组(比如多个 List 的结果合并),可用 merge() 方法:
- 例如分别构建
joiner1 = new StringJoiner("|").add("a").add("b")和joiner2 = new StringJoiner("|").add("c").add("d") - 调用
joiner1.merge(joiner2)后得到"a|b|c|d",前缀后缀保持一致(若不同则忽略被合并者的 prefix/suffix) - 适用于日志聚合、SQL IN 子句拼接等需组合多段数据的场景
注意 null 元素与空字符串行为
StringJoiner 不自动跳过 null,直接 add(null) 会抛出 NullPointerException:
- 安全做法是提前过滤或映射:如
list.stream().filter(Objects::nonNull).map(String::valueOf).collect(...) - 空字符串
""是合法值,会被正常拼接,不会触发特殊处理 - 若需忽略空字符串,应在流操作中加入
.filter(s -> !s.isEmpty())
不复杂但容易忽略细节,合理使用 StringJoiner 能让集合转字符串的代码更健壮、易读、少出错。

















