logo

Почему String.chars() в Java 8 возвращает поток int?

Быстрый ответ

Метод String.chars() возвращает IntStream — поток, содержащий кодовые точки Unicode каждого символа в виде int. Такое решение повышает эффективность, снижая затраты на упаковку символов в объекты типа Character.

Java
Скопировать код
"abc".chars()
    .forEach(System.out::println); // Выводит кодовые точки: 97 98 99

Метод chars() используется для операций над символами в потоках, предоставляя возможность напрямую работать с числовыми значениями.

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

Функция mapToObj используется для преобразования кодовых точек обратно в объекты Character, что позволяет сохранить данные при данном преобразовании.

Java
Скопировать код
"Hello".chars()
    .mapToObj(i -> (char)i)
    .forEach(System.out::println); // Выводит символы: H e l l o

С помощью mapToObj мы преобразуем значения обратно в Character до выполнения каких-либо операций, сохраняя таким образом правильность данных.

Нацелены на эффективность: IntStream

IntStream избегает излишней автоупаковки, что помогает снизить затраты по производительности. Отказываясь от создания объектов Character, мы экономим память и ускоряем обработку данных.

Java
Скопировать код
"Optimized".chars()
    // Улучшение производительности по памяти и процессору!

Сложные преобразования? Без проблем!

IntStream упрощает выполнение сложных операций с символами, например, фильтрацию и преобразование, благодаря числовым кодам Unicode.

Java
Скопировать код
String cleaned = "123abc!".chars()
    .filter(Character::isAlphabetic)
    .mapToObj(c -> String.valueOf((char)c))
    .collect(Collectors.joining()); // Получаем преобразованную строку: "abc".

Обход подводных камней: Решение проблемы

Методы направленного вывода, например System.out::println, ожидают параметр типа int и могут неверно интерпретировать поток кодовых точек.

Java
Скопировать код
"Watch out!".chars()
    .forEach(System.out::println); // Ошибка: будет выведено числовое представление символов

Используйте mapToObj для получения символов в нужном формате.

Java
Скопировать код
"Magic!".chars()
    .mapToObj(i -> (char)i)
    .forEach(System.out::println); // Корректный вывод символов.

Визуализация

Метод String.chars() преобразует строку в числовой поток, представляющий фактические символы от 'А' до 'Я'.

Markdown
Скопировать код
До: Строка "АБВ"
Преобразование: 🔄🔠 -> 🔄🔢 
После: Поток из int-ов [65, 66, 67]

Символ преобразуется в его цифровой эквивалент в Unicode.

Markdown
Скопировать код
| Символ | Unicode |
| ------ | ------- |
| А      | 65      |
| Б      | 66      |
| В      | 67      |

Используемое здесь эмоджи-преобразование: 📝 ➡️ 🔄 ➡️ 🔢

Внутреннее устройство IntStream и его значение

Со введением Java 8 в язык добавили специализированные потоки для работы с примитивными типами данных — IntStream, LongStream, DoubleStream. Они обеспечивают лучшую производительность, устраняя необходимость упаковки.

Java
Скопировать код
"Performance!".chars() // Поддерживает производительность!

Специализированные потоки сосредоточены на быстродействии и не обременены лишними методами.

Переключение на другие потоки: от IntStream к Stream

Вы можете перейти от IntStream к другим видам потоков, используя методы, такие как mapToObj. Это показывает гибкость и эффективность API потоков в Java.

Java
Скопировать код
Stream<String> stringStream = "Conversion".chars()
    .mapToObj(i -> String.valueOf((char)i)); // Переходим к потокам строк!

Балансировка: разработка API

При проектировании Java Stream API было важно добиться баланса между производительностью и удобством использования. String.chars(), возвращающий IntStream, является примером такой оптимизации, иногда заставляющей делать дополнительные действия для достижения цели.

Полезные материалы

  1. String (Java Platform SE 8) — детальная информация о String.chars().
  2. Использование потоков коллекций в Java 8 — статья о сборе элементов с помощью потоков Java 8.
  3. Потоки в Java 8 – работа с примитивами — обзор потоков в Java 8 с упором на примитивные типы.
  4. Упаковка и распаковка в Java — описание механизма упаковки/распаковки, важного для понимания потоков и типов данных в Java.
  5. Java 8: Преобразование символов в числовые значения через поток — пример преобразования символов в числа с помощью String.chars().