深度解析与示例
1. 核心优势与设计
· 自动分隔符管理:无需判断首尾元素,避免经典 StringBuilder 拼接时末尾多余分隔符问题。
· 链式 API:setEmptyValue(), add(), merge() 等方法支持流畅编程。
· 空值友好:自动跳过 null 元素,不引发 NullPointerException(但需注意空集合与 setEmptyValue 的关系)。
2. 典型使用场景
// 基础用法:拼接带分隔符的字符串
StringJoiner sj = new StringJoiner(", ", "[", "]"); // 分隔符, 前缀, 后缀
sj.add("Apple").add("Banana").add(null).add("Orange");
System.out.println(sj); // 输出: [Apple, Banana, Orange] (自动跳过null)
// 合并两个StringJoiner
StringJoiner sj2 = new StringJoiner("-");
sj2.add("Red").add("Blue");
sj.merge(sj2);
System.out.println(sj); // 输出: [Apple, Banana, Orange, Red-Blue]
// 与Stream完美配合:快速生成CSV
List<String> list = Arrays.asList("Java", "Python", "Go");
String result = list.stream()
.filter(s -> !s.startsWith("P"))
.collect(Collectors.joining("; ", "Languages: ", "!"));
System.out.println(result); // 输出: Languages: Java; Go!
3. 性能与陷阱
· 性能接近 StringBuilder:底层复用 StringBuilder,无显著性能损耗。
· 空值处理:add(null) 不抛异常,但空集合时需设置 setEmptyValue 避免返回 prefix + suffix:
StringJoiner emptySj = new StringJoiner(",").setEmptyValue("EMPTY");
System.out.println(emptySj); // 输出: EMPTY
4. 对比传统拼接
场景 StringBuilder StringJoiner
拼接带逗号列表 需手动检查首尾元素避免多余逗号 自动处理分隔符位置
添加前缀/后缀 需显式调用 insert(0,prefix) 和 append(suffix) 构造时直接声明
与Stream集成 需自定义 Collector 直接使用 Collectors.joining
最佳实践:在需处理分隔符、前缀/后缀的拼接场景中,优先选择 StringJoiner,代码更简洁且不易出错。
结语
StringJoiner 虽是小工具,却体现了 Java API 设计中对开发者体验的重视。掌握其特性,能让你的字符串处理代码更加优雅高效。建议在 JDK 8+ 项目中积极采用,替代冗长的传统拼接方式。

被折叠的 条评论
为什么被折叠?



