Mientras revisaba las formas de convertir matrices primitivas en Streams, descubrí que char[]
no son compatibles mientras que otros tipos de matrices primitivas son compatibles. ¿Alguna razón en particular para dejarlos fuera de la corriente?
43
Respuestas:
Como dijo Eran, no es el único que falta.
A
BooleanStream
sería inútil, aByteStream
(si existiera) puede manejarse comoInputStream
o convertirse aIntStream
(como puedeshort
), yfloat
puede manejarse como aDoubleStream
.Como
char
no es capaz de representar todos los caracteres de todos modos (ver relacionado), sería un poco de una corriente legado. Aunque la mayoría de las personas no tienen que lidiar con puntos de código de todos modos, puede parecer extraño. Me refiero a que usasString.charAt()
sin pensar "esto en realidad no funciona en todos los casos".Así que algunas cosas quedaron fuera porque no se consideraron tan importantes. Como dijo JB Nizet en la pregunta vinculada :
La razón
BooleanStream
sería inútil, porque solo tiene 2 valores y eso limita mucho las operaciones. No hay operaciones matemáticas que hacer, y ¿con qué frecuencia está trabajando con muchos valores booleanos de todos modos?fuente
BooleanStream
sería inútil": ¿por qué?reduce(Boolean::logicalAnd)
oreduce(Boolean::logicalOr)
en unboolean[]
? Después de todo, los métodoslogicalAnd
ylogicalOr
se han añadido en Java 8, por lo que puedo hacer estas operaciones de reducción de unStream<Boolean>
... Por cierto, se puede transmitir a través de unachar[]
tan fácil comoCharBuffer.wrap(array).chars()
oCharBuffer.wrap(array).codePoints()
, según el cual semántica lo prefiere.Boolean::logicalAnd
existe, no necesariamente garantiza la existencia de aBooleanStream
. Esos pueden usarse en situaciones lambda que no son stream después de todo. Me imagino que alguien querría hacerloreduce(Boolean::logicalAnd)
, pero en ningún caso nadie necesita hacerlo.while (i < limit)
, pero en ningún caso alguien tiene que hacerlo [sobre el uso de las instrucciones de montaje de rama y salto]"<Primitive>Stream
para cada tipo primitivo es porque hinchará demasiado la API. La pregunta correcta que debe hacerse es "¿por qué hay algoIntStream
?" y la desafortunada respuesta es porque el sistema de tipos de Java no está lo suficientemente desarrollado como para expresarseStream<int>
sin todos los gastos de rendimiento del usoInteger
. Si Java tuviera tipos de valor, que podrían asignarse en la pila o incrustarse directamente en línea dentro de otras estructuras de datos, no habría tanta necesidad de nada además deStream<T>
Por supuesto, la respuesta es " porque eso es lo que decidieron los diseñadores ". No hay una razón técnica por la que
CharStream
no pueda existir.Si desea justificación, generalmente necesita activar la lista de correo de OpenJDK *. La documentación del JDK no tiene la costumbre de justificar por qué algo es por qué es.
Alguien pregunto
La respuesta de Brian Goetz (Java Language Architect) dice
Fuente
También dice lo mismo en otra parte.
Fuente
TL; DR: No vale la pena el costo de mantenimiento.
* En caso de que tenga curiosidad, la consulta de Google que utilicé fue
fuente
100K+ of JDK footprint
?No solo las
char
matrices no son compatibles.Solo hay 3 tipos de flujos primitivos
IntStream
,LongStream
yDoubleStream
.Como resultado,
Arrays
tiene métodos que conviertenint[]
,long[]
ydouble[]
a las corrientes primitivas correspondientes.No existen métodos correspondientes para
boolean[]
,byte[]
,short[]
,char[]
yfloat[]
, puesto que estos tipos primitivos no tienen correspondiente corrientes primitivas.fuente
char
es una parte dependiente deString
- almacenar valores UTF-16. Un símbolo Unicode, un punto de código , a veces es un par de caracteres sustitutos. Por lo tanto, cualquier solución simple con caracteres solo cubre parte del dominio Unicode.Hubo un tiempo que
char
tenía su propio derecho a ser de tipo público. Pero hoy en día es mejor usar puntos de código , anIntStream
. Una corriente de char no podía manejar directamente pares sustitutos.La otra razón más prosaica es que el modelo de "procesador" de JVM utiliza un
int
"registro" más pequeño, manteniendo booleanos, bytes, cortos y también caracteres en una ubicación de almacenamiento de tamaño tan int. Para no necesariamente hinchar las clases de Java, uno se abstuvo de todas las posibles variantes de copia.En el futuro lejano, uno podría esperar que los tipos primitivos funcionen como parámetros de tipo genérico, proporcionando a
List<int>
. Entonces podríamos ver aStream<char>
.Por el momento, es mejor evitarlo
char
y quizás usarlojava.text.Normalizer
para una forma canónica única de puntos de código / cadenas Unicode.fuente