Como otros ya han mencionado, la decisión de diseño detrás de esto fue evitar la explosión de métodos y clases.
Aún así, personalmente creo que esta fue una decisión muy mala, y debería, dado que no quieren tomar CharStream
, lo cual es razonable, métodos diferentes en lugar de chars()
, pensaría en:
Stream<Character> chars()
, que proporciona una secuencia de caracteres de cuadros, que tendrá una ligera penalización de rendimiento.
IntStream unboxedChars()
, que se utilizaría para el código de rendimiento.
Sin embargo , en lugar de centrarnos en por qué se hace de esta manera actualmente, creo que esta respuesta debería centrarse en mostrar una manera de hacerlo con la API que obtuvimos con Java 8.
En Java 7 lo habría hecho así:
for (int i = 0; i < hello.length(); i++) {
System.out.println(hello.charAt(i));
}
Y creo que un método razonable para hacerlo en Java 8 es el siguiente:
hello.chars()
.mapToObj(i -> (char)i)
.forEach(System.out::println);
Aquí obtengo un IntStream
y lo mapeo a un objeto a través de la lambda i -> (char)i
, esto automáticamente lo encuadrará en un Stream<Character>
, y luego podemos hacer lo que queramos, y aún usar referencias de métodos como un plus.
Sin embargo, tenga en cuenta que debe hacerlo mapToObj
, si olvida y usa map
, entonces nada se quejará, pero aún terminará con un IntStream
, y es posible que se pregunte por qué imprime los valores enteros en lugar de las cadenas que representan los caracteres.
Otras alternativas feas para Java 8:
Al permanecer en un IntStream
y querer imprimirlos en última instancia, ya no puede usar referencias de métodos para imprimir:
hello.chars()
.forEach(i -> System.out.println((char)i));
Además, ¡usar referencias de método a su propio método ya no funciona! Considera lo siguiente:
private void print(char c) {
System.out.println(c);
}
y entonces
hello.chars()
.forEach(this::print);
Esto generará un error de compilación, ya que posiblemente haya una conversión con pérdida.
Conclusión:
La API se diseñó de esta manera por no querer agregar CharStream
, personalmente creo que el método debería devolver un Stream<Character>
, y la solución actual es usar mapToObj(i -> (char)i)
en un IntStream
para poder trabajar correctamente con ellos.
CharStream
no existe, ¿cuál sería el problema para agregarlo?