Come altri hanno già detto, la decisione progettuale alla base di ciò è stata quella di prevenire l'esplosione di metodi e classi.
Tuttavia, personalmente penso che questa sia stata una pessima decisione, e dovrei, dato che non vogliono prendere CharStream
, che è ragionevole, metodi diversi invece di chars()
, vorrei pensare a:
Stream<Character> chars()
, che fornisce un flusso di scatole di personaggi, che avranno una leggera penalità prestazionale.
IntStream unboxedChars()
, che verrebbe utilizzato per il codice delle prestazioni.
Tuttavia , invece di concentrarmi sul perché attualmente viene fatto in questo modo, penso che questa risposta dovrebbe focalizzarsi sul mostrare un modo per farlo con l'API che abbiamo ottenuto con Java 8.
In Java 7 l'avrei fatto così:
for (int i = 0; i < hello.length(); i++) {
System.out.println(hello.charAt(i));
}
E penso che un metodo ragionevole per farlo in Java 8 sia il seguente:
hello.chars()
.mapToObj(i -> (char)i)
.forEach(System.out::println);
Qui ottengo un IntStream
e lo mappa su un oggetto tramite lambda i -> (char)i
, questo lo inscatolerà automaticamente in un Stream<Character>
, e quindi possiamo fare quello che vogliamo, e ancora utilizzare i riferimenti di metodo come un plus.
Siate consapevoli del fatto che dovete farlo mapToObj
, se dimenticate e usate map
, allora niente vi lamenterà, ma finirete comunque con un IntStream
, e potreste essere lasciati fuori chiedendovi perché stampa i valori interi anziché le stringhe che rappresentano i caratteri.
Altre brutte alternative per Java 8:
Rimanendo in un IntStream
e volendo stamparli alla fine, non è più possibile utilizzare i riferimenti di metodo per la stampa:
hello.chars()
.forEach(i -> System.out.println((char)i));
Inoltre, l'uso dei riferimenti di metodo al tuo metodo non funziona più! Considera quanto segue:
private void print(char c) {
System.out.println(c);
}
e poi
hello.chars()
.forEach(this::print);
Ciò genererà un errore di compilazione, poiché potrebbe esserci una conversione con perdita.
Conclusione:
L'API è stata progettata in questo modo per non voler aggiungere CharStream
, penso personalmente che il metodo debba restituire un Stream<Character>
, e la soluzione alternativa attualmente è quella di utilizzare mapToObj(i -> (char)i)
un IntStream
per essere in grado di funzionare correttamente con loro.
CharStream
non esiste quale sarebbe il problema aggiungerlo?