Collectors.joining是Stream API中用于字符串拼接的便捷方法,基于StringJoiner实现,支持无分隔符、单分隔符及带前缀后缀的拼接,空流返回空字符串,需注意null元素处理。

Java 中 Stream API 的 joining 是 Collectors 提供的便捷方法,专用于将流中元素拼成字符串,底层调用的是 StringJoiner,支持无分隔符、单分隔符、以及带前缀后缀的拼接。
基础用法:只用分隔符
最常见场景是把字符串列表用逗号、空格等连起来。直接传入分隔符字符串即可:
List<String> words = Arrays.asList("apple", "banana", "cherry");
String result = words.stream()
.collect(Collectors.joining(", "));
// 结果:"apple, banana, cherry"
注意:如果流为空,结果是空字符串(""),不会抛异常。
进阶用法:加前缀和后缀
当需要生成带括号、方括号或 HTML 标签等格式时,可传入三个参数:delimiter、prefix、suffix:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 第一个参数:分隔符(必填)
- 第二个参数:拼接结果开头添加的内容
- 第三个参数:拼接结果结尾添加的内容
例如:
List<String> items = Arrays.asList("a", "b", "c");
String s = items.stream()
.collect(Collectors.joining(" | ", "[", "]"));
// 结果:"[a | b | c]"
处理非字符串类型:先 map 再 joining
Stream 中元素如果不是 String(比如 Integer、自定义对象),需先用 map 转成字符串再拼接:
List<Integer> numbers = Arrays.asList(1, 2, 3);
String nums = numbers.stream()
.map(String::valueOf) // 或 n -> n.toString()
.collect(Collectors.joining("-"));
// 结果:"1-2-3"
List<Person> people = ...;
String names = people.stream()
.map(Person::getName)
.collect(Collectors.joining(", "));
空值安全提醒
joining 本身不处理 null 元素。若流中含 null,会抛 NullPointerException。稳妥做法是提前过滤或替换:
- 过滤掉 null:
.filter(Objects::nonNull) - 转成空字符串:
.map(s -> s == null ? "" : s)
例如:
List<String> withNull = Arrays.asList("a", null, "c");
String safe = withNull.stream()
.filter(Objects::nonNull)
.collect(Collectors.joining(", "));
// 结果:"a, c"

















