String là lớp immutable. Java 9 thêm 2 phương thức trả về IntStream: chars() và codePoints().
1. chars()
Trả về stream int zero-extended từ các char value (UTF-16 code units).
Cú pháp
public IntStream chars()
Ví dụ
import java.util.stream.IntStream;
public class StringCharsMethodTest {
public static void main(String args[]) {
String str = "Welcome to TutorialsPoint";
IntStream intStream = str.chars();
intStream.forEach(x -> System.out.printf("-%s", (char)x));
}
}
Kết quả
-W-e-l-c-o-m-e- -t-o- -T-u-t-o-r-i-a-l-s-P-o-i-n-t
2. codePoints()
Trả về stream của Unicode code point values (xử lý đúng supplementary characters > U+FFFF).
Cú pháp
public IntStream codePoints()
Ví dụ
import java.util.stream.IntStream;
public class StringCodePointsMethodTest {
public static void main(String args[]) {
String str = "Welcome to Tutorix";
IntStream intStream = str.codePoints();
intStream.forEach(x -> System.out.print(new StringBuilder().appendCodePoint(x)));
}
}
Kết quả
Welcome to Tutorix
So sánh chars() vs codePoints()
| Đặc điểm | chars() | codePoints() |
|---|---|---|
| Đơn vị | UTF-16 code unit (char) | Unicode code point (int) |
| Supplementary char | 2 char (surrogate pair) | 1 code point |
| Ví dụ "😀" (U+1F600) | 2 phần tử: 0xD83D, 0xDE00 | 1 phần tử: 0x1F600 |
| Dùng khi | Xử lý char đơn giản | Xử lý Unicode chính xác |
Ứng dụng thực tế
- Đếm ký tự thực sự:
str.codePoints().count(). - Lọc ký tự:
str.codePoints().filter(cp -> ...). - Chuyển đổi:
str.codePoints().collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append).toString().
Hai phương thức này biến String thành first-class citizen trong Stream API.