Почему String.chars() в Java 8 возвращает поток int?
Быстрый ответ
Метод String.chars()
возвращает IntStream
— поток, содержащий кодовые точки Unicode каждого символа в виде int
. Такое решение повышает эффективность, снижая затраты на упаковку символов в объекты типа Character
.
"abc".chars()
.forEach(System.out::println); // Выводит кодовые точки: 97 98 99
Метод chars()
используется для операций над символами в потоках, предоставляя возможность напрямую работать с числовыми значениями.
Обработка преобразований символов
Функция mapToObj
используется для преобразования кодовых точек обратно в объекты Character
, что позволяет сохранить данные при данном преобразовании.
"Hello".chars()
.mapToObj(i -> (char)i)
.forEach(System.out::println); // Выводит символы: H e l l o
С помощью mapToObj
мы преобразуем значения обратно в Character
до выполнения каких-либо операций, сохраняя таким образом правильность данных.
Нацелены на эффективность: IntStream
IntStream
избегает излишней автоупаковки, что помогает снизить затраты по производительности. Отказываясь от создания объектов Character
, мы экономим память и ускоряем обработку данных.
"Optimized".chars()
// Улучшение производительности по памяти и процессору!
Сложные преобразования? Без проблем!
IntStream
упрощает выполнение сложных операций с символами, например, фильтрацию и преобразование, благодаря числовым кодам Unicode.
String cleaned = "123abc!".chars()
.filter(Character::isAlphabetic)
.mapToObj(c -> String.valueOf((char)c))
.collect(Collectors.joining()); // Получаем преобразованную строку: "abc".
Обход подводных камней: Решение проблемы
Методы направленного вывода, например System.out::println
, ожидают параметр типа int
и могут неверно интерпретировать поток кодовых точек.
"Watch out!".chars()
.forEach(System.out::println); // Ошибка: будет выведено числовое представление символов
Используйте mapToObj
для получения символов в нужном формате.
"Magic!".chars()
.mapToObj(i -> (char)i)
.forEach(System.out::println); // Корректный вывод символов.
Визуализация
Метод String.chars()
преобразует строку в числовой поток, представляющий фактические символы от 'А' до 'Я'.
До: Строка "АБВ"
Преобразование: 🔄🔠 -> 🔄🔢
После: Поток из int-ов [65, 66, 67]
Символ преобразуется в его цифровой эквивалент в Unicode.
| Символ | Unicode |
| ------ | ------- |
| А | 65 |
| Б | 66 |
| В | 67 |
Используемое здесь эмоджи-преобразование: 📝 ➡️ 🔄 ➡️ 🔢
Внутреннее устройство IntStream и его значение
Со введением Java 8 в язык добавили специализированные потоки для работы с примитивными типами данных — IntStream
, LongStream
, DoubleStream
. Они обеспечивают лучшую производительность, устраняя необходимость упаковки.
"Performance!".chars() // Поддерживает производительность!
Специализированные потоки сосредоточены на быстродействии и не обременены лишними методами.
Переключение на другие потоки: от IntStream к Stream
Вы можете перейти от IntStream
к другим видам потоков, используя методы, такие как mapToObj
. Это показывает гибкость и эффективность API потоков в Java.
Stream<String> stringStream = "Conversion".chars()
.mapToObj(i -> String.valueOf((char)i)); // Переходим к потокам строк!
Балансировка: разработка API
При проектировании Java Stream API было важно добиться баланса между производительностью и удобством использования. String.chars()
, возвращающий IntStream
, является примером такой оптимизации, иногда заставляющей делать дополнительные действия для достижения цели.
Полезные материалы
- String (Java Platform SE 8) — детальная информация о
String.chars()
. - Использование потоков коллекций в Java 8 — статья о сборе элементов с помощью потоков Java 8.
- Потоки в Java 8 – работа с примитивами — обзор потоков в Java 8 с упором на примитивные типы.
- Упаковка и распаковка в Java — описание механизма упаковки/распаковки, важного для понимания потоков и типов данных в Java.
- Java 8: Преобразование символов в числовые значения через поток — пример преобразования символов в числа с помощью
String.chars()
.