313. Java Stream API - 使用收集器连接字符字符串

313. Java Stream API - 使用收集器连接字符字符串

在 Java Stream API 中,Collectors 工厂类提供了一个非常实用的收集器:joining()。这个收集器专门用于处理字符串流,并将这些字符串连接成一个单一的字符串。它有几个重载版本,可以根据不同的需求进行灵活使用。

joining() 的重载形式

  1. 基本版:没有分隔符,直接将流中的元素连接成一个字符串。
  2. 带分隔符版:为连接的字符串之间添加一个分隔符。
  3. 带分隔符、前缀和后缀版:为连接的字符串添加前缀、后缀,并且可以指定分隔符。

示例:没有分隔符连接字符串

String joined = IntStream.range(0, 10)
                        .boxed()
                        .map(Object::toString)
                        .collect(Collectors.joining());

System.out.println("joined = " + joined);

运行结果:

joined = 0123456789

这个示例中,我们从 09 创建了一个整数流,将它们转换为字符串,并通过 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}"

小结

  1. Collectors.joining() 用法:非常适合将流中的字符串连接成一个单一字符串,可以指定分隔符、前缀和后缀,适用于格式化输出。
  2. 灵活的重载形式:可以根据需求选择不同的重载版本来控制连接的格式。
  3. 空流和单元素流的处理:该收集器能够妥善处理空流和只有一个元素的情况,避免了常见的错误。
  4. 性能考量:如果数据源不是流,或者你只需要连接少量的元素,可以考虑使用 String.join()StringJoiner 来代替,避免流的额外开销。

通过使用 Collectors.joining(),你可以方便地处理字符串的连接操作,提升代码的简洁性和可读性。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容