«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.