Utilisation de Streams avec les types de données primitifs et les wrappers correspondants
-
21-12-2019 - |
Question
En jouant avec l'API Streams de Java8, je suis tombé sur ce qui suit :
Pour convertir un tableau d'objets de classe wrapper primitifs en un Stream
Je dois juste appeler Stream.of(array)
.Mais pour convertir un tableau de types de données primitifs, je dois appeler .of(array)
de la classe de flux wrapper (class) correspondante (<-- cela semble idiot).
Un exemple:
final Integer[] integers = {1, 2, 3};
final int[] ints = {1, 2, 3};
Stream.of(integers).forEach(System.out::println); //That works just fine
Stream.of(ints).forEach(System.out::println); //That doesn't
IntStream.of(ints).forEach(System.out::println); //Have to use IntStream instead
Mes questions):Pourquoi est-ce?Est-ce que cela correspond, par ex.le comportement de Arrays.asList()
qui fonctionne également uniquement pour les tableaux de classes wrapper ?
La solution
Le framework de flux Java 8 a un générique Stream<T>
pour les objets en tant qu'éléments, et trois flux primitifs IntStream
, LongStream
, DoubleStream
pour les trois principales primitives.Si vous travaillez avec des primitives, utilisez-en une, dans votre cas IntStream
.
Regarder la photo:
Ce qui se cache derrière c'est que :
Génériques Java ne peut pas fonctionner avec des types primitifs :il est possible d'avoir seulement
List<Integer>
etStream<Integer>
, mais nonetList<int>
Stream<int>
Quand le Collections Java framework a été introduit, il a été introduit uniquement pour les classes, donc si vous voulez avoir un
List
deint
s, tu dois les emballer pourInteger
s.C'est cher !Quand le Flux Java cadre a été introduit, ils ont décidé de contourner cette surcharge et en parallèle avec les flux "orientés classes" (utilisant le mécanisme générique), ils ont introduit trois ensembles supplémentaires de toutes les fonctions de la bibliothèque, spécifiquement conçus pour les types primitifs les plus importants :
int
,long
,double
.
Et voyez aussi une merveilleuse explication ici : https://stackoverflow.com/a/22919112/2886891