«1. Обзор
В Java 8 появился Stream API с функциональными операциями для обработки последовательностей. Если вы хотите узнать больше об этом, посмотрите эту статью.
В этой быстрой статье мы увидим, как преобразовать строку в поток отдельных символов.
2. Преобразование с использованием chars()
В String API есть новый метод — chars() — с помощью которого мы можем получить экземпляр Stream из объекта String. Этот простой API возвращает экземпляр IntStream из входной строки.
Проще говоря, 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\u003cCharacter\u003e, чтобы отобразить его пользователям:
Stream<Character> characterStream2
= testString.codePoints().mapToObj(c -> (char) c);
4. Преобразование в поток односимвольных строк
До сих пор мы могли получить поток символов; что, если вместо этого нам нужен поток из односимвольных строк?
Как указано ранее в статье, мы будем использовать методы codePoints() или chars() для получения экземпляра IntStream, который теперь можно сопоставить с Stream\u003cString\u003e.
Процесс отображения включает сначала преобразование целых значений в их соответствующие символьные эквиваленты.
Затем мы можем использовать String.valueOf() или Character.toString() для преобразования символов в объект String:
Stream<String> stringStream = testString.codePoints()
.mapToObj(c -> String.valueOf((char) c));
5. Заключение
В этом кратком руководстве мы научимся получать поток символа из объекта String, вызвав методы codePoints() или chars().
Это позволяет нам в полной мере использовать Stream API — удобно и эффективно манипулировать персонажами.
Как всегда, фрагменты кода можно найти на GitHub.