collectors.joining 是 java stream 中用于字符串拼接的收集器,支持分隔符及可选前缀后缀;遇 null 抛异常,需提前过滤;空集合返回空字符串;相比 stringbuilder 更契合函数式链式调用与并行流。

Collectors.joining 是 Java Stream 中专门用于字符串拼接的收集器,能将字符串流高效、简洁地合并为单个字符串,支持指定分隔符(也可加前缀和后缀)。
基础用法:只用分隔符
最常用场景是用逗号、空格等分隔多个字符串:
- 传入一个字符串参数,即为分隔符
- 对字符串 Stream 调用
collect(Collectors.joining(" "))即可拼接
List<string> words = Arrays.asList("Hello", "World", "Java");
String result = words.stream().collect(Collectors.joining(" "));
// 输出:"Hello World Java"</string>
进阶用法:添加前缀和后缀
当需要包裹整体结果时(比如生成 SQL IN 列表、JSON 数组元素),可用三参数重载:
joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix)- prefix 和 suffix 仅作用于最终结果,不作用于每个元素
List<string> ids = Arrays.asList("1", "2", "3");
String sqlIn = ids.stream().collect(Collectors.joining(",", "(", ")"));
// 输出:"(1,2,3)"</string>
注意空值与空集合的处理
joining 默认不处理 null 元素,遇到 null 会抛 NullPointerException:
- 拼接前建议过滤 null:`.filter(Objects::nonNull)`
- 空集合调用 joining 返回空字符串(不是 null),安全
List<string> maybeNulls = Arrays.asList("a", null, "b", "c");
String safeJoin = maybeNulls.stream()
.filter(Objects::nonNull)
.collect(Collectors.joining("-"));
// 输出:"a-b-c"</string>
替代方案对比:为什么不用 StringJoiner 或 StringBuilder?
Stream.collect + joining 更适合函数式链式调用场景:
- 无需手动创建容器对象,代码更紧凑
- 天然兼容并行流(parallelStream 也能正确拼接)
- 与 map/filter 等中间操作组合自然,逻辑更内聚
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











