web-dev-qa-db-ja.com

プリミティブデータ型と対応するラッパーでのストリームの使用

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()の動作?

20
ifloop

Java 8ストリームフレームワークには、要素としてのオブジェクト用の汎用Stream<T>と、主要な3つのプリミティブ用の3つのプリミティブストリームIntStreamLongStreamDoubleStreamがあります。プリミティブを使用する場合は、後者のいずれか、この場合はIntStreamを使用します。

写真を参照してください:

enter image description here

背後にあるのはそれです:

  1. Javaジェネリック プリミティブ型では機能しません:List<Integer>Stream<Integer>のみを持つことは可能ですが、そうではありません List<int> そして Stream<int>

  2. Java Collections フレームワークが導入されたとき、それはクラスに対してのみ導入されたため、Listsのintが必要な場合は、それらをIntegersにラップする必要があります。これはコストがかかります!

  3. Java Streams フレームワークが導入されたとき、彼らはこのオーバーヘッドを回避し、「クラス指向」と並列することを決定しました。ストリーム(ジェネリックメカニズムを使用)では、すべてのライブラリ関数の3つの追加セットが導入され、特に最も重要なプリミティブ型(intlongdouble)用に設計されました。

そして、ここで素晴らしい説明も参照してください: https://stackoverflow.com/a/22919112/2886891

24
Honza Zidek