11
votes

Arrays.stream (tableau) vs Arrays.Aslist (Array) .stream ()

dans Cette question a déjà répondu que Les deux expressions sont égales, mais dans ce cas, ils produisent des résultats différents. Pour un int [] indique code>, pourquoi cela fonctionne-t-il:

Arrays.asList(scores).stream()
        .forEach(System.out::println);


0 commentaires

3 Réponses :


17
votes

Le comportement que vous voyez n'est pas spécifique au flux s. Arrays.Aslist (Scores) Renvoie A Liste Lorsque vous vous transmettez un int [] , depuis un paramètre de type générique ne peut pas être remplacé par un type primitif. Par conséquent, lorsque vous appelez aslist (t ... a) , le compilateur utilise int [] à la place de t .

si vous changez scores sur entier [] , vous obtiendrez la sortie que vous attendez (c.-à-d. Arrays.Aslist (scores) Renvoie une liste ).


3 commentaires

Je vois. C'est juste étrange parce que je me souviens de moi faire des choses comme ça dans le passé et cela a fonctionné. Aurait-il fonctionné si j'avais déclaré la liste d'avance comme ceci: Liste orsassList = Nouvelle ArrayList <> (scores); ?


@Adhominem qui ne fonctionnerait pas, car vous ne pouvez pas transmettre un tableau à un constructeur . Vous ne pouvez transmettre qu'une collection.


Comme une note latérale, stream.of (scores) .foreseach (System.out :: println); fait la même chose que alysé.aSlist (scores) ..). Foreach (système .out :: println); ...



9
votes

La raison pour laquelle la deuxième extrait de code ne fonctionne pas est qu'il n'y a pas de liste en Java. C'est pourquoi arranges.aSlist (scores) ne produit pas ce que vous attendez.

commutation de int [] sur integer [] résoudrait ce problème, en ce sens que les deux pièces de code produiraient des résultats identiques. Cependant, votre code serait moins efficace, car tous les int S soient en boîte.

En fait, l'efficacité est la raison derrière avoir des surcharges du flux pour les matrices primitives. Votre appel arranges.stream (scores) est acheminé vers flux (int [] tableau) , produisant intestream objet. Maintenant, vous pouvez appliquer .forache (system.out :: println) , qui appelle println (int) , évitant à nouveau la boxe.


4 commentaires

Priez pour le projet Valhalla alors: D


@ java8.being: Depuis la rédaction d'un wrapper Liste pour un int [] est d'environ dix lignes de code et pour la diffusion en continu, arrangé.stream (scores) < / Code> travaille déjà, je ne vois pas le point de prier pour quelque chose pour lequel nous ne savons même pas quoi et comment cela changera de ce problème ...


@Holger je voulais dire pour cette ligne: La raison pour laquelle la deuxième extrait de code ne fonctionne pas est qu'il n'y a pas de liste en Java.


@ java8.being: Si le projet Valhalla parvient à modifier cela, il n'y aura aucune différence réelle entre une liste list et une liste <@nonnull INTEGER> et et Arrays.Aslist continuera de faire ce qu'il fait aujourd'hui, pour des raisons de compatibilité ...



1
votes

arranges.Aslist strong> s'attend à ce que des tableaux d'objet ne sont pas des matrices de primitives forts>. Il ne se plaint pas de compiler l'heure, car les matrices de primitive sont un objet.

Il peut prendre un objet comme la liste, mais ce qui est à l'intérieur de cet objet fort> (matrice de primitif est un objet) ne peut pas être converti en liste. p>

Les tableaux de primitif peuvent être convertis en flux en utilisant intestream code>, doubletrestream code> et langetream code> p>

J'aime ce p>

double[] doubleArray = {1.1,1.2,1.3};

DoubleStream.of(doubleArray).forEach(System.out::println);


int[] intArray = {1,2,3,4,5,6};

IntStream.of(intArray).forEach(System.out::println);


long[] longArray = {1L,2L,3L};

LongStream.of(longArray).forEach(System.out::println);


3 commentaires

Quel est le problème avec ma réponse? Tout le moins vous devriez commenter.


Il aide bien sûr comment l'int [] peut être converti en flux.


beaucoup mieux maintenant +1