1. Обзор
Java 8 представила Stream
API с функциональными операциями для обработки последовательностей. Если вы хотите узнать больше об этом, посмотрите эту статью.
В этой быстрой статье мы увидим, как преобразовать строку
в поток
отдельных символов.
2. Преобразование с использованием символов ()
В String
API есть новый метод — chars()
— с помощью которого мы можем получить экземпляр потока
S
из объекта String
. Этот простой API возвращает экземпляр Int
Stream
из входной строки
.
``
Проще говоря, IntStream
содержит целочисленное представление символов из объекта String :
String testString = "String";
IntStream intStream = testString.chars();
Можно работать с целочисленным представлением символов, не преобразовывая их в их символьный
эквивалент. Это может привести к некоторому незначительному приросту производительности, так как не будет необходимости упаковывать каждое целое число в объект Character
.
Однако, если мы хотим отобразить символы для чтения, нам нужно преобразовать целые числа в удобную для человека форму символов :
Stream<Character> characterStream = testString.chars()
.mapToObj(c -> (char) c);
3. Преобразование с использованием codePoints()
В качестве альтернативы мы можем использовать метод codePoints()
для получения экземпляра IntStream
из строки.
Преимущество использования этого API заключается в том, что можно эффективно обрабатывать дополнительные символы Unicode.
Дополнительные символы представлены суррогатными парами Unicode и будут объединены в одну кодовую точку. Таким образом мы можем правильно обработать (и отобразить) любой символ Unicode:
IntStream intStream1 = testString.codePoints();
Нам нужно сопоставить возвращенный IntStream
с Stream<Character>
, чтобы отобразить его пользователям:
Stream<Character> characterStream2
= testString.codePoints().mapToObj(c -> (char) c);
4. Преобразование в поток
односимвольных строк
До сих пор мы могли получить поток
символов; что, если вместо этого нам нужен Stream
из односимвольных строк
?
Как указано ранее в статье, мы будем использовать методы codePoints()
или chars()
для получения экземпляра IntStream
, который теперь можно сопоставить с Stream<String>
.
Процесс отображения включает сначала преобразование целочисленных значений в их соответствующие символьные эквиваленты.
Затем мы можем использовать String.valueOf()
или Character.toString()
для преобразования символов в объект String
:
Stream<String> stringStream = testString.codePoints()
.mapToObj(c -> String.valueOf((char) c));
5. Вывод
В этом кратком руководстве мы научимся получать поток символов
из объекта String , вызывая
методы codePoints()
или chars()
.
Это позволяет нам в полной мере использовать Stream
API — удобно и эффективно манипулировать персонажами.
Как всегда, фрагменты кода можно найти на GitHub .