文章目录
- [289. Java Stream API - 从字符串的字符创建 Stream](#289. Java Stream API - 从字符串的字符创建 Stream)
-
-
- [🎯 核心概念](#🎯 核心概念)
- [📌 示例 1:`Java 10` 及更早版本](#📌 示例 1:
Java 10及更早版本) - [🧠 讲解:](#🧠 讲解:)
- [📌 示例 2:`Java SE 11` 及以后版本](#📌 示例 2:
Java SE 11及以后版本) - [🧠 讲解:](#🧠 讲解:)
- [📚 小贴士](#📚 小贴士)
- [🎓 应用场景](#🎓 应用场景)
- [🎯 小测验(课堂互动)](#🎯 小测验(课堂互动))
- [📌 总结](#📌 总结)
-
289. Java Stream API - 从字符串的字符创建 Stream
🎯 核心概念
在 Java SE 8 中,String 类新增了一个 chars() 方法。这个方法返回一个 IntStream,其中包含了字符串中每个字符的 代码点 (code point)。这些字符代码点是整数,通常类似于 ASCII 码。
为了将 IntStream 中的代码点转换回字符,通常需要将其转化为字符类型并进行后续操作。
📌 示例 1:Java 10 及更早版本
在 Java SE 10 及之前版本,你可以使用以下代码:
java
String sentence = "Hello Duke";
List<String> letters =
sentence.chars() // 获取字符流(以 code point 的形式)
.mapToObj(codePoint -> (char) codePoint) // 将 code point 转换为字符
.map(Object::toString) // 转换为 String 类型
.toList(); // 收集为列表
System.out.println("letters = " + letters);
🧾 输出:
java
letters = [H, e, l, l, o, , D, u, k, e]
🧠 讲解:
sentence.chars():将字符串转换为IntStream,流中的每个元素是字符串字符的整数代码点。mapToObj(codePoint -> (char) codePoint):将每个整数代码点转换为char类型的字符。map(Object::toString):把字符转换成字符串。toList():将流收集到List<String>中。
这种方式虽然有效,但稍显繁琐。
📌 示例 2:Java SE 11 及以后版本
在 Java SE 11 中,Character 类新增了一个 toString() 方法,可以让我们直接简化代码:
java
String sentence = "Hello Duke";
List<String> letters =
sentence.chars() // 获取字符流(以 code point 的形式)
.mapToObj(Character::toString) // 使用 Character.toString() 转换为字符串
.toList(); // 收集为列表
System.out.println("letters = " + letters);
🧾 输出:
java
letters = [H, e, l, l, o, , D, u, k, e]
🧠 讲解:
- 现在我们直接使用
Character::toString来简化字符到字符串的转换。 - 其余的部分与前面的例子相同。
这种方式在 Java SE 11 及更高版本中使用起来更加简洁。
📚 小贴士
- 代码点(code point) :指的是字符在
Unicode编码中的表示方式。例如,字符H的代码点是72,字符e的代码点是101。 - 在 Java 中,字符 是
16位的,但代码点 可以是32位的,支持更多的字符(包括Emoji等)。
🎓 应用场景
- 字符串分析:提取每个字符并进行个别处理,例如统计字符频率、查找特定字符等。
- 字符替换:将字符流中的每个字符根据某些规则进行替换。
- 国际化 :在多语言支持的系统中,处理不同编码的字符时,字符的代码点可以帮助我们处理所有的
Unicode字符。
🎯 小测验(课堂互动)
问题: 在 sentence.chars() 返回的流中,'H' 的代码点是多少?
✅ A. 72
❌ B. 101
✅ 正确答案: A
📌 总结
String.chars()是将字符串转换为字符流的有力工具。Java SE 11简化了代码,提供了更简洁的字符转字符串的方式。- 理解字符的 代码点 是理解字符串流操作的基础。