Перейти к основному содержимому

Преобразование строки в поток символов

· 2 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

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 .