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
BooleanStreamsería inútil, aByteStream(si existiera) puede manejarse comoInputStreamo convertirse aIntStream(como puedeshort), yfloatpuede manejarse como aDoubleStream.Como
charno 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
BooleanStreamserí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
BooleanStreamsería inútil": ¿por qué?reduce(Boolean::logicalAnd)oreduce(Boolean::logicalOr)en unboolean[]? Después de todo, los métodoslogicalAndylogicalOrse 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::logicalAndexiste, 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>Streampara 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
CharStreamno 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
charmatrices no son compatibles.Solo hay 3 tipos de flujos primitivos
IntStream,LongStreamyDoubleStream.Como resultado,
Arraystiene 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
chares 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
chartení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
chary quizás usarlojava.text.Normalizerpara una forma canónica única de puntos de código / cadenas Unicode.fuente