何か変なことに気付いたとき、私はJava 8ストリームの使い方を学びました。
Arrays.stream()
には、float配列以外のすべてのメソッドがあります。
Arrays.stream(int[]) : IntStream
Arrays.stream(long[]) : LongStream
Arrays.stream(double[]) : DoubleStream
同様に、int、doubleなどのStream実装がありますが、floatはありません。
IntStream
LongStream
DoubleStream
その理由はありますか?
フロートストリームを操作するための推奨される方法は何ですか?
cay S. HorstmannによるJava SE 8 for the Really Impatient
から:
2.12。プリミティブ型ストリーム
... short、char、byte、およびbooleanを格納する場合は、IntStreamを使用し、floatの場合は、DoubleStreamを使用します。ライブラリの設計者は、さらに5つのストリームタイプを追加する価値があるとは考えていませんでした。
これはより良い方法です。データのコピーは含まれません。
DoubleStream ds = IntStream.range(0, floatArray.length)
.mapToDouble(i -> floatArray[i]);
私は自分にこの質問をしました。それに答えるために、私は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/ =