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 IntStream
e 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 IntStream
e 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 IntStream
e 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 IntStream
para poder trabalhar corretamente com eles.
CharStream
não existe, qual seria o problema para adicioná-lo?