Проходя через способы преобразования примитивных массивов в потоки, я обнаружил, что char[]
они не поддерживаются, в то время как поддерживаются другие типы примитивных массивов. Есть какая-то конкретная причина, чтобы оставить их в потоке?
43
Ответы:
Как сказал Эран, это не единственный пропавший.
A
BooleanStream
будет бесполезным, aByteStream
(если он существует) может быть обработан какInputStream
или преобразован вIntStream
(как можетshort
), иfloat
может быть обработан какDoubleStream
.Поскольку
char
в любом случае невозможно представить все символы (см. Ссылку), это будет немного устаревшим потоком. Хотя большинству людей в любом случае не приходится иметь дело с кодовыми точками, это может показаться странным. Я имею в виду, что вы используете,String.charAt()
не думая, что «это не работает во всех случаях».Поэтому некоторые вещи были опущены, потому что они не считались такими важными. Как сказал Дж. Б. Низет в связанном вопросе :
Причина
BooleanStream
будет бесполезной, потому что у вас есть только 2 значения, и это сильно ограничивает операции. Там нет математических операций, и как часто вы работаете с большим количеством логических значений в любом случае?источник
BooleanStream
было бы бесполезно»: почему?reduce(Boolean::logicalAnd)
илиreduce(Boolean::logicalOr)
, наboolean[]
? В конце концов, методыlogicalAnd
иlogicalOr
были добавлены в Java 8, так что я могу выполнять эти операции сокращения aStream<Boolean>
... Кстати, вы можете выполнять потоковую передачу поchar[]
так легкоCharBuffer.wrap(array).chars()
илиCharBuffer.wrap(array).codePoints()
, в зависимости от того, какую семантику вы предпочитаете.Boolean::logicalAnd
, что существует, он не обязательно гарантирует существованиеBooleanStream
. В конце концов, они могут быть использованы в лямбда-ситуациях, не связанных с потоком. Я могу представить, что кто-то захочет это сделатьreduce(Boolean::logicalAnd)
, но никому не нужно это делать.while (i < limit)
, но ни в коем случае никому не нужно делать это [с использованием инструкций по сборке веток и переходов]»<Primitive>Stream
примитивов, заключается в том, что они слишком сильно раздувают API. Правильный вопрос, который нужно задать, это "почемуIntStream
вообще?" и неудачный ответ заключается в том, что система типов Java не достаточно понятна, чтобы выразить ееStream<int>
без потери производительности при использованииInteger
. Если Java были типов значений, которые могут быть выделены в стеке или встраивать непосредственно в линии внутри других структур данных, то не было бы такой необходимости что - либо , кромеStream<T>
Конечно, ответ « потому что так решили дизайнеры ». Нет технической причины, по которой
CharStream
не могло существовать.Если вы хотите оправдания, вам обычно нужно включить список рассылки OpenJDK *. Документация JDK не имеет привычки обосновывать, почему что-то есть, почему это так.
Кто-то спросил
В ответе Брайана Гетца (Java Language Architect) говорится:
Источник
Он также говорит то же самое в другом месте
Источник
TL; DR: не стоит затрат на обслуживание.
* Если вам интересно, я использовал запрос Google:
источник
100K+ of JDK footprint
?Это не только
char
массивы, которые не поддерживаются.Есть только три типа примитивных потоков -
IntStream
,LongStream
иDoubleStream
.В результате
Arrays
имеют методы , которые преобразуютint[]
,long[]
иdouble[]
к соответствующим примитивным потокам.Там нет соответствующих методов
boolean[]
,byte[]
,short[]
,char[]
иfloat[]
, так как эти примитивные типов имеют соответствующие примитивные потоки.источник
char
является зависимой частьюString
хранения значений UTF-16. Символ Unicode, кодовая точка , иногда является суррогатной парой символов. Таким образом, любое простое решение с символами покрывает только часть домена Unicode.Было время, которое
char
имело собственное право быть публичным типом. Но в наше время, лучше использовать кодовые точки ,IntStream
. Поток полукокса не может напрямую обрабатывать суррогатные пары.Другая более прозаическая причина заключается в том, что модель «процессора» JVM использует
int
наименьший «регистр», сохраняя логические значения, байты, шорты, а также символы в таком месте хранения int. Чтобы не обязательно раздувать Java-классы, нужно воздерживаться от всех возможных вариантов копирования.В далеком будущем можно ожидать, что примитивные типы могут функционировать как параметры универсального типа, обеспечивая a
List<int>
. Тогда мы можем увидетьStream<char>
.На данный момент лучше избегать
char
и, возможно, использоватьjava.text.Normalizer
для уникальной канонической формы кодовые точки / строки Unicode.источник