背景

在 Java 开发中,字符串拼接是高频操作。传统的 + 运算符或 StringBuilder 虽然常用,但在处理分隔符、前缀/后缀时容易显得冗余。JDK 8 引入的 StringJoiner 专为这类场景设计,能让代码更简洁、可读性更强。本文将从基础用法到进阶技巧,全面讲解 StringJoiner 的使用。

StringJoiner 核心功能

StringJoiner 位于 java.util 包下,核心作用是按指定分隔符拼接字符串,并支持添加统一的前缀和后缀。其构造方法有两种:

// 仅指定分隔符  
StringJoiner(CharSequence delimiter)  

// 指定分隔符、前缀、后缀  
StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix)  

基础用法:快速拼接带分隔符的字符串

场景:将集合中的元素用逗号分隔拼接(如 a,b,c)。

示例 1:无前后缀的拼接

StringJoiner sj = new StringJoiner(",");  
sj.add("Java").add("Python").add("Go");  
System.out.println(sj.toString()); // 输出:Java,Python,Go  

示例 2:带前后缀的拼接

// 分隔符为逗号,前缀为 "[", 后缀为 "]"  
StringJoiner sj = new StringJoiner(",", "[", "]");  
sj.add("Apple").add("Banana").add("Cherry");  
System.out.println(sj.toString()); // 输出:[Apple,Banana,Cherry]  

进阶技巧:结合集合与 Stream API

StringJoiner 常与 Stream 配合,处理集合元素的拼接,代码更简洁。

示例 3:拼接 List 元素

List<String> languages = Arrays.asList("Java", "Python", "Go");  
String result = languages.stream()  
    .collect(Collectors.joining(",")); // 等价于 StringJoiner 的基础用法  
System.out.println(result); // 输出:Java,Python,Go  

示例 4:带前后缀的 Stream 拼接

List<String> fruits = Arrays.asList("Apple", "Banana", "Cherry");  
String result = fruits.stream()  
    .collect(Collectors.joining(",", "[", "]"));   
System.out.println(result); // 输出:[Apple,Banana,Cherry]  

注意Collectors.joining() 底层通过 StringJoiner 实现,简化了集合拼接的代码。

处理空值与默认值

若 StringJoiner 未添加任何元素,直接调用 toString() 会返回空字符串。可通过 setEmptyValue() 设置默认值。

示例 5:空集合的默认值处理

StringJoiner sj = new StringJoiner(",", "[", "]");  
sj.setEmptyValue("[]"); // 未添加元素时返回默认值  
System.out.println(sj.toString()); // 输出:[](而非空字符串)  

与 StringBuilder 的对比

场景 StringJoiner StringBuilder
分隔符拼接 直接支持,代码简洁 需手动追加分隔符,易遗漏
前缀/后缀 构造方法直接指定 需手动在首尾追加,逻辑繁琐
集合/Stream 配合 支持 Collectors.joining() 需遍历集合,手动拼接
空值处理 内置 setEmptyValue() 需手动判断长度后处理

结论

  • 简单拼接(无分隔符):优先用 StringBuilder(性能略优)。
  • 带分隔符/前后缀的拼接:优先用 StringJoinerCollectors.joining()(代码更清晰)。

实战案例:拼接对象属性

假设需拼接用户列表的 id,格式为 [1001,1002,1003]

class User {  
    private Long id;  
    // 省略构造方法和 getter  
}  

List<User> users = Arrays.asList(new User(1001L), new User(1002L), new User(1003L));  

String ids = users.stream()  
    .map(User::getId) // 提取 id  
    .map(String::valueOf) // 转为字符串  
    .collect(Collectors.joining(",", "[", "]"));   

System.out.println(ids); // 输出:[1001,1002,1003]  

注意事项

  • 线程安全性:StringJoiner 与 StringBuilder 一样,非线程安全,多线程环境下需手动同步。
  • 性能:与 StringBuilder 性能接近,无需担心额外开销。
  • JDK 版本:仅 JDK 8+ 支持,低版本需兼容时可使用 Guava 的 Joiner 工具类。

总结

StringJoiner 是处理分隔符、前缀、后缀拼接的高效工具,尤其适合集合元素的格式化输出。结合 Stream API 后,代码可读性和简洁性大幅提升,推荐在实际开发中优先使用。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐