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>
。转换分两步:
- 将整数转为字符
- 用
String.valueOf()
或Character.toString()
转为字符串
Stream<String> stringStream = testString.codePoints()
.mapToObj(c -> String.valueOf((char) c));
✅ 推荐使用 String.valueOf()
,它内部会优化处理单字符情况。
5. 总结
本文介绍了两种将字符串转换为字符流的核心方法:
chars()
:处理基础字符,性能略优codePoints()
:完整支持 Unicode,适合国际化场景
通过这些方法,我们可以充分利用 Stream API 的强大功能,高效处理字符操作。
完整代码示例可在 GitHub 获取。