web-dev-qa-db-ja.com

フロートからストリームを取得する方法[]

何か変なことに気付いたとき、私はJava 8ストリームの使い方を学びました。

Arrays.stream()には、float配列以外のすべてのメソッドがあります。

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

同様に、int、doubleなどのStream実装がありますが、floatはありません。

  • IntStream
  • LongStream
  • DoubleStream

その理由はありますか?

フロートストリームを操作するための推奨される方法は何ですか?

34

cay S. HorstmannによるJava SE 8 for the Really Impatientから:

2.12。プリミティブ型ストリーム

... short、char、byte、およびbooleanを格納する場合は、IntStreamを使用し、floatの場合は、DoubleStreamを使用します。ライブラリの設計者は、さらに5つのストリームタイプを追加する価値があるとは考えていませんでした。

25
marcinj

これはより良い方法です。データのコピーは含まれません。

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

私は自分にこの質問をしました。それに答えるために、私はFloatToIntFunctionやByteToCharFunction、そして(もちろん)FloatStream、CharStream、ByteStreamなどのようなものを含むライブラリの作業を始めました。それはすぐに頭痛の種になりました。

すべてのプリミティブデータ型間のメソッドとインターフェイスを作成する必要があるため、これを行うのはライブラリ開発者側の多くの作業でした。より多くのデータ型を実装すると、それはますます大きな混乱になります。 floatから他のすべてのプリミティブ型に、doubleから他のすべてのプリミティブ型に、charから他のすべてのプリミティブ型に、などのメソッドを実装する必要があると想像してください。

これの長期的な解決策は、Javaに値タイプを追加して、Stream<int>およびStream<float>ラッパータイプを使用するのではなく(Stream<Integer>およびStream<Float>

Java将来的に追加される可能性があるこの機能の更新については、Project Vahallaを参照してください。 http://openjdk.Java.net/projects/valhalla/ =

1
HesNotTheStig