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"
进阶用法:添加前缀和后缀
当需要包裹整体结果时(比如生成 SQL IN 列表、JSON 数组元素),可用三参数重载:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
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)"
注意空值与空集合的处理
joining 默认不处理 null 元素,遇到 null 会抛 NullPointerException:
立即学习“Java免费学习笔记(深入)”;
- 拼接前建议过滤 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"
替代方案对比:为什么不用 StringJoiner 或 StringBuilder?
Stream.collect + joining 更适合函数式链式调用场景:
- 无需手动创建容器对象,代码更紧凑
- 天然兼容并行流(parallelStream 也能正确拼接)
- 与 map/filter 等中间操作组合自然,逻辑更内聚

















