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,欢迎参考。


原始标题:Java StringJoiner | Baeldung

« 上一篇: Java TreeSet 完全指南
» 下一篇: Java Weekly, 第210期