1. 简介
StringJoiner 是 Java 8 在 java.util
包中新增的工具类。
简单来说,它可以用指定的分隔符、前缀和后缀来拼接字符串,特别适合处理带格式的字符串拼接场景。
2. 添加元素
通过 add()
方法逐个添加字符串元素:
@Test
public void whenAddingElements_thenJoinedElements() {
StringJoiner joiner = new StringJoiner(",", PREFIX, SUFFIX);
joiner.add("Red")
.add("Green")
.add("Blue");
assertEquals(joiner.toString(), "[Red,Green,Blue]");
}
⚠️ 踩坑提示:如果需要拼接整个 List,必须手动遍历——StringJoiner 没有直接支持集合操作的方法:
@Test
public void whenAddingListElements_thenJoinedListElements() {
List<String> rgbList = new ArrayList<>();
rgbList.add("Red");
rgbList.add("Green");
rgbList.add("Blue");
StringJoiner rgbJoiner = new StringJoiner(
",", PREFIX, SUFFIX);
for (String color : rgbList) {
rgbJoiner.add(color);
}
assertEquals(rgbJoiner.toString(), "[Red,Green,Blue]");
}
3. 构造方式
创建 StringJoiner 时必须指定分隔符,前缀和后缀是可选的:
private String PREFIX = "[";
private String SUFFIX = "]";
@Test
public void whenEmptyJoinerWithoutPrefixSuffix_thenEmptyString() {
StringJoiner joiner = new StringJoiner(",");
assertEquals(0, joiner.toString().length());
}
@Test
public void whenEmptyJoinerJoinerWithPrefixSuffix_thenPrefixSuffix() {
StringJoiner joiner = new StringJoiner(
",", PREFIX, SUFFIX);
assertEquals(joiner.toString(), PREFIX + SUFFIX);
}
✅ 关键特性:
- 无前缀/后缀的空拼接器返回空字符串
- 有前缀/后缀的空拼接器返回
"[ ]"
这样的格式
可通过 setEmptyValue()
覆盖默认空值行为:
@Test
public void whenEmptyJoinerWithEmptyValue_thenDefaultValue() {
StringJoiner joiner = new StringJoiner(",");
joiner.setEmptyValue("default");
assertEquals(joiner.toString(), "default");
}
@Test
public void whenEmptyJoinerWithPrefixSuffixAndEmptyValue_thenDefaultValue() {
StringJoiner joiner = new StringJoiner(",", PREFIX, SUFFIX);
joiner.setEmptyValue("default");
assertEquals(joiner.toString(), "default");
}
⚠️ 注意:自定义空值仅在拼接器完全为空时生效,添加任何元素后即失效。
4. 合并拼接器
使用 merge()
合并两个拼接器时,被合并拼接器的前缀和后缀会被忽略:
@Test
public void whenMergingJoiners_thenReturnMerged() {
StringJoiner rgbJoiner = new StringJoiner(
",", PREFIX, SUFFIX);
StringJoiner cmybJoiner = new StringJoiner(
"-", PREFIX, SUFFIX);
rgbJoiner.add("Red")
.add("Green")
.add("Blue");
cmybJoiner.add("Cyan")
.add("Magenta")
.add("Yellow")
.add("Black");
rgbJoiner.merge(cmybJoiner);
assertEquals(
rgbJoiner.toString(),
"[Red,Green,Blue,Cyan-Magenta-Yellow-Black]");
}
✅ 合并特性:
- 主拼接器(rgbJoiner)保持原有分隔符
,
- 被合并内容(cmybJoiner)保留其原始分隔符
-
- 最终结果统一使用主拼接器的前缀和后缀
5. Stream API 集成
StringJoiner 的核心价值体现在 Stream API 的 Collectors.joining()
中:
@Test
public void whenUsedWithinCollectors_thenJoined() {
List<String> rgbList = Arrays.asList("Red", "Green", "Blue");
String commaSeparatedRGB = rgbList.stream()
.map(color -> color.toString())
.collect(Collectors.joining(","));
assertEquals(commaSeparatedRGB, "Red,Green,Blue");
}
Collectors.joining()
内部就是用 StringJoiner 实现的,这解决了手动遍历集合的痛点。
6. 总结
StringJoiner 的核心能力总结:
✅ 优势:
- 简单粗暴的字符串拼接方案
- 与 Stream API 深度集成
- 支持自定义空值处理
❌ 局限:
- 不支持直接拼接集合(需手动遍历)
- 功能相对基础,复杂场景需扩展
如果 StringJoiner 满足不了需求,推荐试试 Guava 的 Joiner
类,功能更强大。
所有示例代码已托管至 GitHub,欢迎参考。