Java 8では、Stream.map()
そしてStream.flatMap()
方法は?
ベストアンサー1
とmap
は両方ともflatMap
a に適用できStream<T>
、どちらも a を返しますStream<R>
。違いは、map
演算は入力値ごとに 1 つの出力値を生成するのに対し、flatMap
演算は入力値ごとに任意の数 (0 個以上) の値を生成することです。
これは各操作の引数に反映されます。
このmap
操作は を受け取りますFunction
。これは入力ストリーム内の各値に対して呼び出され、出力ストリームに送信される 1 つの結果値を生成し、
このflatMap
操作は、概念的には 1 つの値を消費して任意の数の値を生成する関数を取ります。ただし、Java では、メソッドが 0 または 1 つの値しか返せないため、メソッドが任意の数の値を返すのは面倒です。マッパー関数がflatMap
値を受け取り、値の配列または を返しList
、それが出力に送信される API を想像できます。これがストリーム ライブラリであることを考えると、任意の数の戻り値を表すのに特に適した方法は、マッパー関数自体がストリームを返すことです。マッパーによって返されるストリームの値は、ストリームから排出され、出力ストリームに渡されます。マッパー関数への各呼び出しによって返される値の「塊」は、出力ストリームではまったく区別されないため、出力は「平坦化」されていると言われます。
典型的な使用法は、ゼロ値を送信する場合や、複数の値を返す場合などに、マッパー関数flatMap
が を返すことです。ただし、もちろん任意のストリームを返すことができます。Stream.empty()
Stream.of(a, b, c)