web-dev-qa-db-fra.com

Comment obtenir un flux d'un flotteur []

J'apprenais à utiliser les flux Java 8 lorsque j'ai remarqué quelque chose de bizarre.

Arrays.stream() a des méthodes pour tout sauf les tableaux flottants: 

  • Arrays.stream(int[]) : IntStream
  • Arrays.stream(long[]) : LongStream
  • Arrays.stream(double[]) : DoubleStream

De même, il existe des implémentations de flux pour int, double, etc.

  • IntStream
  • LongStream
  • DoubleStream

Y at-il une raison à cela? 

quelle est la méthode recommandée pour travailler avec des flux flottants?

29
Arnaud Denoyelle

de Java SE 8 for the Really Impatient par Cay S. Horstmann: 

2.12. Flux de type primitif

... Si vous souhaitez stocker short, char, byte et boolean, utilisez un IntStream, et pour float, un DoubleStream. Les concepteurs de bibliothèques Ne pensaient pas que cela valait la peine d’ajouter cinq autres types de flux.

23
marcinj

Voici un meilleur moyen de ne pas copier les données. 

DoubleStream ds = IntStream.range(0, floatArray.length)
                           .mapToDouble(i -> floatArray[i]);
32
Brian Goetz

Je me suis posé cette question. Pour y répondre, j'ai commencé à travailler sur une bibliothèque qui comprenait des éléments tels que FloatToIntFunction et ByteToCharFunction et (bien sûr) FloatStream, CharStream, ByteStream, etc. C'est vite devenu un mal de tête pour moi.

Cela aurait nécessité BEAUCOUP de travail pour les développeurs de la bibliothèque, car il faudrait créer des méthodes et des interfaces pour TOUS les types de données primitifs. Au fur et à mesure que vous implémentez plus de types de données, cela devient un gâchis de plus en plus grand. Imaginez devoir mettre en œuvre des méthodes pour passer de float à tous les autres types primitifs, doubler à tous les autres types primitifs, char à tous les autres types primitifs, etc.

La solution à long terme est que Java ajoute des types de valeur afin que vous puissiez effectuer des opérations telles que Stream<int> et Stream<float> au lieu d'utiliser des types d'encapsuleur (Stream<Integer> et Stream<Float>).

Jetez un coup d’œil à Project Vahalla pour des mises à jour de cette fonctionnalité qui pourrait être ajoutée à Java à l’avenir. http://openjdk.Java.net/projects/valhalla/

0
HesNotTheStig