Collectors.joining 拼接字符串简洁高效,支持无分隔符、指定分隔符、添加前缀后缀三种用法,并需前置过滤 null 或空值以避免异常。

Java 中用 Collectors.joining 拼接字符串元素非常简洁高效,核心在于它专为 Stream 的终端操作设计,避免手动循环和 StringBuilder 拼接的冗余代码。
基础用法:默认无分隔符拼接
最简单场景是把字符串列表直接连成一个字符串,不加任何分隔符:
List<string> list = Arrays.asList("a", "b", "c");</string>String result = list.stream().collect(Collectors.joining()); // 输出 "abc"
注意:如果流中含 null 元素,会抛 NullPointerException,建议提前过滤或映射处理。
指定分隔符:最常用场景
多数时候需要逗号、顿号或换行等分隔符,直接传入字符串参数即可:
立即学习“Java免费学习笔记(深入)”;
list.stream().collect(Collectors.joining(",")); // "a,b,c"list.stream().collect(Collectors.joining(" | ")); // "a | b | c"list.stream().collect(Collectors.joining("\n")); // 换行拼接
分隔符可以是任意字符串,包括空格、制表符甚至 emoji,但需确保元素本身不含非法字符(如未转义的换行符可能影响格式)。
添加前缀与后缀:构建完整结构
当需要包裹括号、引号或标签时,三参数版本更实用:
list.stream().collect(Collectors.joining(",", "[", "]")); // "[a,b,c]"list.stream().collect(Collectors.joining(";", "<ul>", "</ul>")); // "<ul>a;b;c</ul>"
前缀和后缀只在非空流时生效;若流为空,结果就是前缀+后缀(如 "[]"),这点比手动判断更可靠。
结合 map 或 filter 避免空值干扰
实际数据常含 null 或空字符串,直接拼接易出错。推荐组合使用:
- 过滤空值:
list.stream().filter(Objects::nonNull).filter(s -> !s.trim().isEmpty()).collect(Collectors.joining(",")) - 安全转换:
stream.map(s -> s == null ? "" : s).collect(Collectors.joining(",")) - 统一处理:
stream.map(String::valueOf).collect(Collectors.joining(","))(适用于数字、布尔等类型)
避免在 joining 内部做判空,逻辑应前置到 map/filter 阶段,保持收集器职责单一。
不复杂但容易忽略细节,用对参数和前置处理,就能写出干净又健壮的字符串拼接逻辑。


















