Java8のStreams-APIで遊んでいるときに、私は次のことに気づきました。
プリミティブラッパークラスオブジェクトの配列をStream
に変換するには、Stream.of(array)
を呼び出す必要があります。しかし、プリミティブデータ型の配列を変換するには、対応するラッパー(クラス)ストリームクラスから.of(array)
を呼び出す必要があります(<-ばかげているように聞こえます)。
例:
_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
_
私の質問:これはなぜですか?これは、たとえばラッパークラス配列でも機能するArrays.asList()
の動作?
Java 8ストリームフレームワークには、要素としてのオブジェクト用の汎用Stream<T>
と、主要な3つのプリミティブ用の3つのプリミティブストリームIntStream
、LongStream
、DoubleStream
があります。プリミティブを使用する場合は、後者のいずれか、この場合はIntStream
を使用します。
写真を参照してください:
背後にあるのはそれです:
Javaジェネリック プリミティブ型では機能しません:List<Integer>
とStream<Integer>
のみを持つことは可能ですが、そうではありません そして List<int>
Stream<int>
Java Collections フレームワークが導入されたとき、それはクラスに対してのみ導入されたため、List
sのint
が必要な場合は、それらをInteger
sにラップする必要があります。これはコストがかかります!
Java Streams フレームワークが導入されたとき、彼らはこのオーバーヘッドを回避し、「クラス指向」と並列することを決定しました。ストリーム(ジェネリックメカニズムを使用)では、すべてのライブラリ関数の3つの追加セットが導入され、特に最も重要なプリミティブ型(int
、long
、double
)用に設計されました。
そして、ここで素晴らしい説明も参照してください: https://stackoverflow.com/a/22919112/2886891