Почему char [] единственные массивы, которые не поддерживаются Arrays.stream ()? - PullRequest
43 голосов
/ 03 февраля 2020

Проходя пути преобразования примитивных массивов в потоки, я обнаружил, что char[] не поддерживается, в то время как другие типы примитивных массивов поддерживаются. Есть какая-то конкретная причина, чтобы оставить их в потоке?

Ответы [ 4 ]

32 голосов
/ 03 февраля 2020

Конечно, ответ «, потому что именно так решили дизайнеры ». Не существует технической причины, по которой CharStream не может существовать.

Если вы хотите получить обоснование, вам обычно нужно включить список рассылки OpenJDK *. Документация JDK не имеет привычки обосновывать почему что-то, почему это так.

Кто-то спросил

Использование IntStream для представления потока символов / байтов является немного неудобно. Должны ли мы также добавить CharStream и ByteStream?

В ответе Брайана Гетца (Java Language Architect) сказано:

Краткий ответ: нет.

Для этих форм, которые используются почти никогда, не стоит больше 100K + JDK каждого. И если бы мы добавили их, кто-то потребовал бы short, float или boolean.

Другими словами, если бы люди настаивали на том, что у нас есть все примитивные специализации, у нас не было бы примитивных специализаций. Что было бы хуже, чем статус-кво.

Источник

Он также говорит то же самое в других местах

Если вы хотите использовать их как символы, вы можете уменьшить их символам достаточно легко. Не кажется достаточно важным вариантом использования, чтобы иметь целый «другой набор потоков». (То же самое с Short, Byte, Float).

Источник

TL; DR: Не стоит затрат на обслуживание.


* Если вам интересно, я использовал Google-запрос

site:http://mail.openjdk.java.net/ charstream
31 голосов
/ 03 февраля 2020

Как сказал Эран, пропал не единственный.

A BooleanStream будет бесполезным, ByteStream (если он существует) может быть обработан как InputStream или преобразован в IntStream (как может short), а float может быть обработано как DoubleStream.

Поскольку char в любом случае не может представлять все символы (см. ссылку), это будет бит устаревшего потока. Хотя большинству людей все равно не приходится иметь дело с кодовыми точками, это может показаться странным. Я имею в виду, что вы используете String.charAt(), не думая, что «это на самом деле не работает во всех случаях».

Так что некоторые вещи были опущены, потому что они не считались такими важными. Как сказал Дж. Б. Низет в связанном вопросе :

Разработчики явно решили избежать взрыва классов и методов, ограничив примитивные потоки тремя типами, так как другие типы (char, short, float) может быть представлен их большим эквивалентом (int, double) без какого-либо существенного снижения производительности.

Причина, по которой BooleanStream будет бесполезной, состоит в том, что у вас есть только 2 значения и это сильно ограничивает операции. Нет математических операций, и как часто вы работаете с большим количеством логических значений?

7 голосов
/ 03 февраля 2020

Это не только char массивы, которые не поддерживаются.

Существует только 3 типа примитивных потоков - IntStream, LongStream и DoubleStream.

Как результат, Arrays имеет методы, которые преобразуют int[], long[] и double[] в соответствующие примитивные потоки.

Нет соответствующих методов для boolean[], byte[], short[], char[] и float[], поскольку у этих примитивных типов нет соответствующих примитивных потоков.

6 голосов
/ 03 февраля 2020

char является зависимой частью String - сохранение значений UTF-16. Символ Unicode, кодовая точка , иногда является суррогатной парой символов. Таким образом, любое простое решение с использованием символов chars охватывает только часть домена Unicode.

Было время, когда char имел собственное право быть типом publi c. Но в настоящее время лучше использовать кодовые точки , IntStream. Поток char не может напрямую обрабатывать суррогатные пары.

Другая более прозаическая причина c заключается в том, что модель "JVM-процессора" использует int в качестве наименьшего "регистра", сохраняя логические значения, байты, шорты а также символы в таком месте хранения. Чтобы не обязательно разбрасывать java классы, один воздерживался от всех возможных вариантов копирования.

В далеком будущем можно ожидать, что примитивные типы могут функционировать как универсальные параметры типа c, обеспечивая List<int>. Тогда мы можем увидеть Stream<char>.

. На данный момент лучше избегать char и, возможно, использовать java.text.Normalizer для уникальной канонической формы кодовых точек / строк Юникода.

...