Comme d'autres l'ont déjà mentionné, la décision de conception derrière cela était d'empêcher l'explosion des méthodes et des classes.
Pourtant, personnellement, je pense que c'était une très mauvaise décision, et il devrait y avoir, étant donné qu'ils ne veulent pas prendre CharStream
, ce qui est raisonnable, des méthodes différentes au lieu de chars()
, je penserais à:
Stream<Character> chars()
, cela donne un flux de caractères de boîtes, ce qui aura une légère pénalité de performance.
IntStream unboxedChars()
, qui serait utilisé pour le code de performance.
Cependant , au lieu de se concentrer sur les raisons pour lesquelles cela est fait de cette façon actuellement, je pense que cette réponse devrait se concentrer sur montrer un moyen de le faire avec l'API que nous avons obtenue avec Java 8.
Dans Java 7, je l'aurais fait comme ceci:
for (int i = 0; i < hello.length(); i++) {
System.out.println(hello.charAt(i));
}
Et je pense qu'une méthode raisonnable pour le faire dans Java 8 est la suivante:
hello.chars()
.mapToObj(i -> (char)i)
.forEach(System.out::println);
Ici, j'obtiens un IntStream
et le mappe à un objet via le lambda i -> (char)i
, cela le placera automatiquement dans un Stream<Character>
, et nous pourrons alors faire ce que nous voulons, et continuer à utiliser des références de méthode comme un plus.
Sachez cependant que vous devez le faire mapToObj
, si vous oubliez et utilisez map
, alors rien ne se plaindra, mais vous vous retrouverez quand même avec un IntStream
, et vous pourriez vous demander pourquoi il imprime les valeurs entières au lieu des chaînes représentant les caractères.
Autres alternatives laides pour Java 8:
En restant dans un IntStream
et en voulant les imprimer finalement, vous ne pouvez plus utiliser de références de méthode pour l'impression:
hello.chars()
.forEach(i -> System.out.println((char)i));
De plus, utiliser des références de méthode à votre propre méthode ne fonctionne plus! Considérer ce qui suit:
private void print(char c) {
System.out.println(c);
}
puis
hello.chars()
.forEach(this::print);
Cela donnera une erreur de compilation, car il y a peut-être une conversion avec perte.
Conclusion:
L'API a été conçue de cette façon parce que CharStream
je ne veux pas ajouter , je pense personnellement que la méthode devrait renvoyer un Stream<Character>
, et la solution de contournement consiste actuellement à utiliser mapToObj(i -> (char)i)
sur un IntStream
pour pouvoir fonctionner correctement avec eux.
CharStream
n'existe pas quel serait le problème de l'ajouter?