В Java 8 мы можем решить это как:
String str = "xyz";
str.chars().forEachOrdered(i -> System.out.print((char)i));
str.codePoints().forEachOrdered(i -> System.out.print((char)i));
Метод chars () возвращает IntStream
, как указано в doc :
Возвращает поток значений int, расширяющих ноль, из этого
последовательность. Любой символ, который отображается на суррогатную кодовую точку, передается
через не истолковано. Если последовательность видоизменяется во время потока
читаемый результат не определен.
Метод codePoints()
также возвращает IntStream
согласно документу:
Возвращает поток значений кодовой точки из этой последовательности. любой
суррогатные пары, встречающиеся в последовательности, объединяются, как если бы
Character.toCodePoint и результат передается в поток. любой
другие единицы кода, включая обычные символы BMP, непарные
суррогаты и неопределенные единицы кода расширяются от нуля до значений int
которые затем передаются в поток.
Чем отличаются символ и кодовая точка? Как упоминалось в этой статье:
Unicode 3.1 добавлены дополнительные символы, в результате чего общее количество
символов до более чем 216 символов, которые могут быть
отличается от одного 16-битного char
. Следовательно, значение char
дольше имеет непосредственное сопоставление с основной семантической единицей в
Unicode. JDK 5 был обновлен для поддержки большего набора символов
ценности. Вместо изменения определения типа char
, некоторые из
новые дополнительные символы представлены суррогатной парой
из двух char
значений. Чтобы уменьшить путаницу имен, кодовая точка будет
используется для обозначения числа, которое представляет конкретный Unicode
персонаж, в том числе дополнительные.
Наконец, почему forEachOrdered
, а не forEach
?
Поведение forEach
явно недетерминировано, когда forEachOrdered
выполняет действие для каждого элемента этого потока, в порядке встречи потока , если поток имеет определенный порядок встречи. Таким образом, forEach
не гарантирует, что заказ будет сохранен. Также проверьте этот вопрос для получения дополнительной информации.
Для разницы между символом, кодовой точкой, глифом и графемой отметьте вопрос .