Java 8ストリームのmap()
とmapToObj()
メソッドの違いはわかりません。どちらの場合でも、オブジェクトを作成してストリームに戻すことができるので、なぜこれらのメソッドが1つではなく2つ存在しますか。mapとmapToObjのJavaストリームの違い
私に例を挙げて教えてください。
Java 8ストリームのmap()
とmapToObj()
メソッドの違いはわかりません。どちらの場合でも、オブジェクトを作成してストリームに戻すことができるので、なぜこれらのメソッドが1つではなく2つ存在しますか。mapとmapToObjのJavaストリームの違い
私に例を挙げて教えてください。
このクールなパターンが表示されます。 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
タイプ/
'IntStream'と' Stream
primitive
とobject
データタイプのバージョン(つまり、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
を使用する可能性のある理由は同じです。
これらはプリミティブストリーム上にのみ存在し、プリミティブ型をマップするために 'map'が動作します。 'IntStream.map(IntOperator)'。 –