2017-12-14 40 views
6

Java 8ストリームのmap()mapToObj()メソッドの違いはわかりません。どちらの場合でも、オブジェクトを作成してストリームに戻すことができるので、なぜこれらのメソッドが1つではなく2つ存在しますか。mapとmapToObjのJavaストリームの違い

私に例を挙げて教えてください。

+4

これらはプリミティブストリーム上にのみ存在し、プリミティブ型をマップするために 'map'が動作します。 'IntStream.map(IntOperator)'。 –

答えて

11

このクールなパターンが表示されます。 Streamクラスには、IntStream,LongStream,DoubleStreamなどが含まれています。これは、ストリーム操作でプリミティブ型を使用できるようにするためです。それ以外の場合は、Stream<Integer>またはStream<Double>を使用する必要があります。

同様に、mapの方法もこれを行う。 Stream<T>クラスでは、mapToInt,mapToDoubleのメソッドがありますが、状況はIntStream,DoubleStreamクラスで少し異なります。

IntStreamでは、mapメソッドは、intをintにマップするIntUnaryOperatorを取ります。ストリームをStream<T>にマップする場合は、mapToObjを使用する必要があります。 mapToObjは、intにマップするmapと区別されるため、いい名前です。これは、ストリームがIntStreamからStream<T>に変化したことを示します。そうmapToIntがそうのように命名されている理由と同じ理由であるようmapToObjが命名された理由 - Streamタイプ/

+2

'IntStream'と' Stream 'の間で転送し、このパターンに適合する' boxed() 'メソッドの言及を追加するかもしれません。 – daniu

3

primitiveobjectデータタイプのバージョン(つまり、int型と整数、ダブル、ダブルの変化を示すために、等)は、Javaでは実際には互いに互換性がありません。彼らはauto-boxing/unboxingという特別なステップで互換性があります。したがって、プリミティブintのストリームがあり、ストリームと関数のオブジェクトバージョンを使用しようとすると(つまり、ストリームと関数、ボクシングと要素のアンボックスのコストが発生します)

この問題を解決するには、機能パッケージはprimitive specialized versions of streamsだけでなく、functional interfacesが含まれています。たとえば、代わりにStream<Integer>を使用しての、あなたがIntStreamを使用する必要があります。あなたは今IntFunctionを使用してストリームの各要素を処理することができます。これは完全に自動ボクシング/アンボクシングを避けることができます。

したがってプリミティブ要素のストリームを処理したいときはいつでも、プリミティブに特化したストリーム(IntStream、LongStream、DoubleStream)とプリミティブに特化した関数inteすなわち、 IntFunction、IntConsumer、IntSupplierなど)を使用してパフォーマンスを向上させることができます。

もう1つ注目すべきことは、プリミティブな特殊な機能インターフェイス(IntFunction、DoubleFunction、IntConsumerなど)は、プリミティブではない機能インターフェイス(つまり、関数、コンシューマなど)を拡張しないことです。

java.util.function packageには、すべての機能インターフェイスのint、double、およびlong(ただしfloatはありません)バージョンが含まれています。たとえば、Functionのint型、double型、long型のIntFunction、DoubleFunction、およびLongFunctionがあります。これらの関数は、IntStream、DoubleStream、LongStreamなどのストリームのプリミティブ専用バージョンとともに使用されます。

は、いくつかの例を見てみましょう:結論として

Stream stream = Stream.of(1, 2, 3); //Will compile fine 
IntStream intStream = IntStream.of(4, 5, 6); //Will compile fine 

Stream s = IntStream.of(4, 5, 6); //Does not compile 
Stream s = IntStream.of(4, 5, 6).mapToObj(e -> e); //mapToObj method is needed 
IntStream is = Stream.of(4, 5, 6).mapToInt(e -> e); //mapToInt method is needed 

あなたはストリームの種類を変更することである、mapToIntを使用する場合がありますように、あなたがmapToObjを使用する可能性のある理由は同じです。

関連する問題