Ao analisar as maneiras de converter matrizes primitivas em Streams, descobri que char[]
elas não são suportadas enquanto outros tipos de matrizes primitivas são suportadas. Algum motivo específico para deixá-los de fora no fluxo?
43
Respostas:
Como Eran disse, não é o único que falta.
A
BooleanStream
seria inútil, aByteStream
(se existir) pode ser tratado como umInputStream
ou convertido emIntStream
(como podeshort
) efloat
pode ser tratado como umDoubleStream
.Como
char
não é capaz de representar todos os caracteres de qualquer maneira (veja o link), seria um pouco um fluxo herdado. Embora a maioria das pessoas não precise lidar com pontos de código de qualquer maneira, isso pode parecer estranho. Quero dizer, você usaString.charAt()
sem pensar "isso realmente não funciona em todos os casos".Então, algumas coisas foram deixadas de fora porque não foram consideradas tão importantes. Como disse JB Nizet na pergunta vinculada :
O motivo
BooleanStream
seria inútil, porque você tem apenas 2 valores e isso limita muito as operações. Não há operações matemáticas a serem feitas, e com que frequência você trabalha com muitos valores booleanos?fonte
BooleanStream
seria inútil": por quê?reduce(Boolean::logicalAnd)
oureduce(Boolean::logicalOr)
em umboolean[]
? Afinal, os métodoslogicalAnd
elogicalOr
foram adicionados no Java 8, para que eu possa fazer essas operações de redução de umStream<Boolean>
… Aliás, você pode transmitir por umchar[]
tão fácil quantoCharBuffer.wrap(array).chars()
ouCharBuffer.wrap(array).codePoints()
, dependendo da semântica que preferir.Boolean::logicalAnd
existe, não necessariamente garante a existência de umBooleanStream
. Afinal, eles podem ser usados em situações lambda sem fluxo. Eu posso imaginar que alguém iria querer fazerreduce(Boolean::logicalAnd)
, mas em nenhum caso qualquer necessidade de fazê-lo.while (i < limit)
, mas em nenhum caso alguém precisa fazê-lo [usando instruções de montagem de ramificação e salto]"<Primitive>Stream
tipo primitivo é porque ela inchará muito a API. A pergunta correta a ser feita é "por que existeIntStream
?" e a resposta infeliz é que o sistema de tipos do Java não é desenvolvido o suficiente para ser expressoStream<int>
sem toda a despesa de desempenho do usoInteger
. Se o Java tivesse tipos de valor, que poderiam ser alocados na pilha ou incorporados diretamente em linha em outras estruturas de dados, não haveria essa necessidade de mais nadaStream<T>
Obviamente, a resposta é " porque é isso que os designers decidiram ". Não há razão técnica para
CharStream
não existir.Se você deseja justificativa, geralmente precisa virar a lista de discussão do OpenJDK *. A documentação do JDK não tem o hábito de justificar por que razão existe alguma coisa.
Alguém perguntou
A resposta de Brian Goetz (Java Language Architect) diz
Fonte
Ele também diz o mesmo em outro lugar
Fonte
TL; DR: Não vale o custo de manutenção.
* Caso você esteja curioso, a consulta do Google que usei foi
fonte
100K+ of JDK footprint
?Não são apenas as
char
matrizes que não são suportadas.Existem apenas 3 tipos de fluxos primitivos -
IntStream
,LongStream
eDoubleStream
.Como resultado,
Arrays
tem métodos que convertemint[]
,long[]
edouble[]
para os fluxos de primitivas correspondentes.Não há métodos correspondentes para
boolean[]
,byte[]
,short[]
,char[]
efloat[]
, uma vez que estes tipos primitivos não têm fluxos primitivos correspondente.fonte
char
é uma parte dependente doString
armazenamento de valores UTF-16. Às vezes , um símbolo Unicode, um ponto de código , é um par substituto de caracteres. Portanto, qualquer solução simples com caracteres cobre apenas parte do domínio Unicode.Houve um tempo que
char
tinha seu próprio direito de ser do tipo público. Mas hoje em dia é melhor usar pontos de código , umIntStream
. Um fluxo de caracteres não podia lidar diretamente com pares substitutos.A outra razão mais prosaica é que o modelo de "processador" da JVM usa o
int
menor "registro", mantendo booleanos, bytes, shorts e também caracteres em um local de armazenamento de tamanho int. Para não necessariamente inchar as classes java, uma se absteve de todas as variantes de cópia possíveis.Em um futuro distante, pode-se esperar que tipos primitivos possam funcionar como parâmetros de tipo genérico, fornecendo a
List<int>
. Então podemos ver aStream<char>
.Por enquanto, é melhor evitar
char
e talvez usarjava.text.Normalizer
para uma forma canônica exclusiva de pontos de código / seqüências de caracteres Unicode.fonte