En parcourant les façons de convertir des tableaux primitifs en flux, j'ai constaté qu'ils char[]
ne sont pas pris en charge alors que d'autres types de tableaux primitifs sont pris en charge. Une raison particulière de les laisser de côté?
43
Réponses:
Comme l'a dit Eran, ce n'est pas le seul qui manque.
Un
BooleanStream
serait inutile, unByteStream
(s'il existait) peut être traité comme unInputStream
ou converti enIntStream
(comme peutshort
), etfloat
peut être traité comme unDoubleStream
.Comme il
char
n'est pas en mesure de représenter tous les personnages de toute façon (voir lié), ce serait un peu un flux hérité. Bien que la plupart des gens n'aient pas à gérer les points de code de toute façon, cela peut sembler étrange. Je veux dire que vous utilisezString.charAt()
sans penser "cela ne fonctionne pas dans tous les cas".Certaines choses ont donc été laissées de côté parce qu'elles n'étaient pas jugées si importantes. Comme l'a dit JB Nizet dans la question liée :
La raison
BooleanStream
serait inutile, car vous n'avez que 2 valeurs et cela limite beaucoup les opérations. Il n'y a aucune opération mathématique à faire, et à quelle fréquence travaillez-vous avec beaucoup de valeurs booléennes de toute façon?la source
BooleanStream
serait inutile": pourquoi?reduce(Boolean::logicalAnd)
oureduce(Boolean::logicalOr)
sur unboolean[]
? Après tout, les méthodeslogicalAnd
etlogicalOr
ont été ajoutées dans Java 8, donc je peux faire ces opérations de réduction d'unStream<Boolean>
… Au fait, vous pouvez diffuser sur unchar[]
aussi simple queCharBuffer.wrap(array).chars()
ouCharBuffer.wrap(array).codePoints()
, selon la sémantique que vous préférez.Boolean::logicalAnd
existe, il ne garantit pas nécessairement l'existence d'unBooleanStream
. Ceux-ci peuvent être utilisés dans des situations lambda non stream après tout. Je peux imaginer que quelqu'un voudra fairereduce(Boolean::logicalAnd)
, mais en aucun cas ce que quelqu'un besoin de le faire.while (i < limit)
, mais en aucun cas personne ne doit le faire [en utilisant les instructions de montage de branchement et de saut]"<Primitive>Stream
pour chaque type primitif est parce que cela va trop gonfler l'API. La bonne question à poser est "pourquoi y a-t-ilIntStream
du tout?" et la réponse malheureuse est que le système de type de Java n'est pas suffisamment étoffé pour s'exprimerStream<int>
sans toutes les dépenses de performance liées à l'utilisationInteger
. Si Java avait des types de valeur, qui pourraient être alloués sur la pile ou incorporés directement en ligne dans d'autres structures de données, il n'y aurait rien de plus nécessaireStream<T>
Bien sûr, la réponse est " parce que c'est ce que les concepteurs ont décidé ". Il n'y a aucune raison technique pour laquelle
CharStream
il ne pourrait pas exister.Si vous souhaitez une justification, vous devez généralement désactiver la liste de diffusion OpenJDK *. La documentation du JDK n'a pas l'habitude de justifier pourquoi quelque chose est pourquoi c'est.
Quelqu'un a demandé
La réponse de Brian Goetz (Java Language Architect) dit
La source
Il dit aussi la même chose ailleurs
La source
TL; DR: Ne vaut pas le coût de maintenance.
* Si vous êtes curieux, la requête Google que j'ai utilisée était
la source
100K+ of JDK footprint
?Ce ne sont pas seulement les
char
tableaux qui ne sont pas pris en charge.Il n'y a que 3 types de flux primitifs -
IntStream
,LongStream
etDoubleStream
.Par conséquent,
Arrays
a des méthodes qui convertissentint[]
,long[]
etdouble[]
aux courants primitifs correspondants.Il n'y a pas de méthodes correspondantes pour
boolean[]
,byte[]
,short[]
,char[]
etfloat[]
, étant donné que ces types primitifs ont pas correspondant courants primitifs.la source
char
est une partie dépendante duString
- stockage des valeurs UTF-16. Un symbole Unicode, un point de code , est parfois une paire de caractères de substitution. Donc, toute solution simple avec des caractères ne couvre qu'une partie du domaine Unicode.Il fut un temps qui
char
avait son propre droit d'être un type public. Mais de nos jours, il vaut mieux utiliser des points de code , unIntStream
. Un flux d'ombles ne pouvait pas gérer directement les paires de substitution.L'autre raison plus prosaïque est que le modèle de "processeur" JVM utilise un
int
"registre" aussi petit, gardant les booléens, les octets, les shorts et les caractères dans un tel emplacement de stockage de taille int. Pour ne pas nécessairement gonfler les classes java, on s'est abstenu de toutes les variantes de copie possibles.Dans un avenir lointain, on pourrait s'attendre à ce que les types primitifs puissent fonctionner comme des paramètres de type génériques, fournissant a
List<int>
. Ensuite, nous pourrions voir unStream<char>
.Pour le moment, mieux vaut éviter
char
, et peut-être utiliserjava.text.Normalizer
pour une forme canonique unique de points de code / chaînes Unicode.la source