313. Java Stream API - 使用收集器连接字符字符串
在 Java Stream API 中,Collectors 工厂类提供了一个非常实用的收集器:joining()。这个收集器专门用于处理字符串流,并将这些字符串连接成一个单一的字符串。它有几个重载版本,可以根据不同的需求进行灵活使用。
✅ joining() 的重载形式
- 基本版:没有分隔符,直接将流中的元素连接成一个字符串。
- 带分隔符版:为连接的字符串之间添加一个分隔符。
- 带分隔符、前缀和后缀版:为连接的字符串添加前缀、后缀,并且可以指定分隔符。
示例:没有分隔符连接字符串
String joined = IntStream.range(0, 10)
.boxed()
.map(Object::toString)
.collect(Collectors.joining());
System.out.println("joined = " + joined);
运行结果:
joined = 0123456789
这个示例中,我们从 0 到 9 创建了一个整数流,将它们转换为字符串,并通过 joining() 将它们连接成一个没有任何分隔符的字符串。
示例:带分隔符连接字符串
String joined = IntStream.range(0, 10)
.boxed()
.map(Object::toString)
.collect(Collectors.joining(", "));
System.out.println("joined = " + joined);
运行结果:
joined = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
在这个示例中,我们使用了 Collectors.joining(", ") 来在每个数字之间添加一个逗号和空格作为分隔符。
示例:带分隔符、前缀和后缀连接字符串
String joined = IntStream.range(0, 10)
.boxed()
.map(Object::toString)
.collect(Collectors.joining(", ", "{", "}"));
System.out.println("joined = " + joined);
运行结果:
joined = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
在这个例子中,我们不仅添加了分隔符,还为最终的字符串加上了 { 和 } 作为前缀和后缀。
✅ 空流和单元素流的处理
Collectors.joining() 能够很好地处理流为空或流中只有单个元素的情况:
- 如果流为空,
joining()返回一个空字符串。 - 如果流中只有一个元素,它将仅返回该元素的字符串表示,不添加分隔符、前缀或后缀。
例如:
String emptyJoin = Stream.<String>empty().collect(Collectors.joining(", "));
System.out.println("emptyJoin = " + emptyJoin); // 输出空字符串
String singleJoin = Stream.of("Hello").collect(Collectors.joining(", "));
System.out.println("singleJoin = " + singleJoin); // 输出 "Hello"
运行结果:
emptyJoin =
singleJoin = Hello
✅ 使用场景和性能考量
Collectors.joining() 是一个非常有用的工具,特别是在你需要将流中的元素拼接成一个格式化的字符串时。你可能会用它来构建 CSV 数据、日志输出、或者其他需要字符串连接的场景。
但是,如果你不需要处理集合中的多个元素,或者你的数据并不是通过流来获取的,使用 String.join() 或 StringJoiner 对象可能会更加高效,避免了创建流的额外开销。例如:
使用 String.join() 示例:
String result = String.join(", ", "one", "two", "three");
System.out.println(result); // 输出 "one, two, three"
使用 StringJoiner 示例:
StringJoiner joiner = new StringJoiner(", ", "{", "}");
joiner.add("one").add("two").add("three");
System.out.println(joiner.toString()); // 输出 "{one, two, three}"
✅ 小结
-
Collectors.joining()用法:非常适合将流中的字符串连接成一个单一字符串,可以指定分隔符、前缀和后缀,适用于格式化输出。 - 灵活的重载形式:可以根据需求选择不同的重载版本来控制连接的格式。
- 空流和单元素流的处理:该收集器能够妥善处理空流和只有一个元素的情况,避免了常见的错误。
-
性能考量:如果数据源不是流,或者你只需要连接少量的元素,可以考虑使用
String.join()或StringJoiner来代替,避免流的额外开销。
通过使用 Collectors.joining(),你可以方便地处理字符串的连接操作,提升代码的简洁性和可读性。