1. 概述

Java 8 引入了 Stream API,提供了类似函数式的操作来处理序列。想深入了解的话,可以参考这篇文章

本文将简单粗暴地介绍如何将 String 转换为单个字符组成的 Stream

2. 使用 chars() 方法转换

String API 新增了 chars() 方法,能直接从字符串获取 Stream 实例。这个简单的方法会返回一个 IntStream,其中包含字符串中字符的整数表示:

String testString = "String";
IntStream intStream = testString.chars();

✅ 可以直接操作字符的整数形式,无需转换为 Character 对象,能避免装箱开销,提升性能。

但如果需要显示字符,就得转换成人类可读的 Character 形式:

Stream<Character> characterStream = testString.chars()
  .mapToObj(c -> (char) c);

⚠️ 注意:这里直接强制转换 (char) c 是安全的,因为 chars() 返回的是有效的 UTF-16 编码单元。

3. 使用 codePoints() 方法转换

另一种选择是使用 codePoints() 方法,它同样返回 IntStream。这个方法的优势在于能正确处理 Unicode 补充字符。

补充字符由 Unicode 代理对表示,codePoints() 会将其合并为单个码点,确保正确处理所有 Unicode 符号:

IntStream intStream1 = testString.codePoints();

同样需要映射到 Stream<Character> 才能显示:

Stream<Character> characterStream2 
  = testString.codePoints().mapToObj(c -> (char) c);

❌ 踩坑提醒:如果字符串包含代理对(如 Emoji),用 chars() 会拆分成两个字符,而 codePoints() 能保持完整。

4. 转换为单字符字符串流

前面得到的是字符流,如果需要单字符组成的字符串流(Stream<String>)?也很简单:

先用 codePoints()chars() 获取 IntStream,然后映射到 Stream<String>。转换分两步:

  1. 将整数转为字符
  2. String.valueOf()Character.toString() 转为字符串
Stream<String> stringStream = testString.codePoints()
  .mapToObj(c -> String.valueOf((char) c));

✅ 推荐使用 String.valueOf(),它内部会优化处理单字符情况。

5. 总结

本文介绍了两种将字符串转换为字符流的核心方法:

  • chars():处理基础字符,性能略优
  • codePoints():完整支持 Unicode,适合国际化场景

通过这些方法,我们可以充分利用 Stream API 的强大功能,高效处理字符操作。

完整代码示例可在 GitHub 获取。


原始标题:Converting String to Stream of chars