Como outros já mencionaram, a decisão de design por trás disso foi impedir a explosão de métodos e classes.
Ainda assim, pessoalmente, acho que foi uma péssima decisão, e deveria, dado que eles não querem tomar CharStream, o que é razoável, métodos diferentes em vez de chars(), eu pensaria em:
Stream<Character> chars(), que fornece um fluxo de caracteres de caixas, que terão alguma penalidade no desempenho de luz.
IntStream unboxedChars(), que seria usado para o código de desempenho.
No entanto , em vez de focar no motivo de isso ser feito atualmente, acho que essa resposta deve se concentrar em mostrar uma maneira de fazer isso com a API que obtivemos com o Java 8.
No Java 7, eu teria feito assim:
for (int i = 0; i < hello.length(); i++) {
System.out.println(hello.charAt(i));
}
E acho que um método razoável para fazer isso no Java 8 é o seguinte:
hello.chars()
.mapToObj(i -> (char)i)
.forEach(System.out::println);
Aqui eu obtenho um IntStreame mapeio-o para um objeto via lambda i -> (char)i, isso o colocará automaticamente em um Stream<Character>, e então podemos fazer o que queremos, e ainda usar as referências de método como um plus.
Esteja ciente de que você deve fazer mapToObj, se você esquecer e usar map, nada reclamará, mas você ainda terá um IntStreame poderá ficar se perguntando por que ele imprime os valores inteiros em vez das cadeias que representam os caracteres.
Outras alternativas feias para Java 8:
Ao permanecer em um IntStreame desejando imprimi-los, você não poderá mais usar referências de métodos para imprimir:
hello.chars()
.forEach(i -> System.out.println((char)i));
Além disso, o uso de referências de métodos ao seu próprio método não funciona mais! Considere o seguinte:
private void print(char c) {
System.out.println(c);
}
e depois
hello.chars()
.forEach(this::print);
Isso gerará um erro de compilação, pois possivelmente há uma conversão com perdas.
Conclusão:
A API foi projetada dessa maneira, por não querer adicionar CharStream, eu pessoalmente acho que o método deve retornar a Stream<Character>, e a solução atualmente é usar mapToObj(i -> (char)i)uma IntStreampara poder trabalhar corretamente com eles.
CharStreamnão existe, qual seria o problema para adicioná-lo?