java stream中joining拼接字符串需配合collectors.joining(),支持单分隔符、前缀/分隔符/后缀三参数及与map/filter等组合使用,空集合返回空字符串,但不处理null元素。

Java Stream 中用 joining 拼接字符串,核心是配合 Collectors.joining() 使用,它专为 Stream 的字符串收集设计,简洁高效。
基础用法:只传分隔符
最常用的是传入一个分隔符,把流中每个元素转成字符串后用该符号连接:
List<string> list = Arrays.asList("a", "b", "c");
String result = list.stream().collect(Collectors.joining(", "));
// 结果:"a, b, c"
</string>
- 元素必须是字符串,或能自动调用
toString()(如数字、对象) - 空集合会返回空字符串
""
进阶用法:加前缀和后缀
三个参数版本可指定前缀、分隔符、后缀,适合生成带括号或标签的格式:
List<integer> nums = Arrays.asList(1, 2, 3);
String result = nums.stream()
.map(String::valueOf)
.collect(Collectors.joining(" | ", "[", "]"));
// 结果:"[1 | 2 | 3]"
</integer>
- 注意:
joining不处理 null 元素,遇到 null 会抛NullPointerException - 如果数据可能含 null,先用
filter(Objects::nonNull)或map(x -> x == null ? "" : x.toString())
结合其他操作一起用
常和 map、filter 配合,实现条件拼接:
List<person> people = Arrays.asList(
new Person("Alice", 30),
new Person("Bob", 25)
);
String names = people.stream()
.filter(p -> p.getAge() > 20)
.map(Person::getName)
.collect(Collectors.joining(" & "));
// 结果:"Alice & Bob"
</person>
- 推荐先
map转成字符串再joining,避免类型不匹配 - 若需去重或排序,可在
collect前加distinct()或sorted()
替代方案对比:什么时候不用 joining?
如果只是简单拼接固定几个字符串,直接用 String.join() 更轻量:
String result = String.join("-", "a", "b", "c"); // "a-b-c"
-
String.join()接收Iterable或多个字符串,不依赖 Stream -
Collectors.joining()优势在于能自然嵌入 Stream 流水线,链式调用更流畅
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











