map()およびflatMap()
map()
関数はラムダパラメータを取り、Tは要素、RはTを使用して作成された戻り要素を受け取ります。最後に、タイプRのオブジェクトを持つストリームが作成されます。簡単な例は次のとおりです。
Stream
.of(1,2,3,4,5)
.map(myInt -> "preFix_"+myInt)
.forEach(System.out::println);
それは単純にTypeの要素1から5を取りInteger
、各要素を使用してString
、値"prefix_"+integer_value
を持つタイプから新しい要素を構築し、それを出力します。
flatMap()
flatMap()関数取ることを知っておくと便利ですF<T, R>
どこに
Tは、Streamをから/で構築できる型です。これは、リスト(T.stream())、配列(Arrays.stream(someArray))など、Streamの元となるフォーム、またはフォームの元となるものであれば何でもかまいません。以下の例では、各開発者には多くの言語があるため、開発者です。言語はリストであり、ラムダパラメータを使用します。
Rは、Tを使用して構築される結果のストリームです。Tのインスタンスが多いことを知っていると、当然、Rからのストリームも多くなります。タイプRからのこれらすべてのストリームは、タイプRからの単一の「フラット」ストリームに結合されます。。
例
Bachiri Taoufiqの例は、 ここでの答えがシンプルで理解しやすいと考えています。わかりやすくするために、開発者のチームがあるとします。
dev_team = {dev_1,dev_2,dev_3}
、各開発者は多くの言語を知っています:
dev_1 = {lang_a,lang_b,lang_c},
dev_2 = {lang_d},
dev_2 = {lang_e,lang_f}
適用 Stream.mapを()各DEVの言語を取得するにはdev_teamに:
dev_team.map(dev -> dev.getLanguages())
この構造を与えるでしょう:
{
{lang_a,lang_b,lang_c},
{lang_d},
{lang_e,lang_f}
}
これは基本的にList<List<Languages>> /Object[Languages[]]
です。それほどきれいではなく、Java8ライクでもありません。
でStream.flatMap()
、それは上記の構造とるよう、あなたの事を「フラット化」することができます
し、に変わり、それを{lang_a, lang_b, lang_c, lang_d, lang_e, lang_f}
基本的に使用することができ、List<Languages>/Language[]/etc
...
したがって、最終的には、コードは次のように理解しやすくなります。
dev_team
.stream() /* {dev_1,dev_2,dev_3} */
.map(dev -> dev.getLanguages()) /* {{lang_a,...,lang_c},{lang_d}{lang_e,lang_f}}} */
.flatMap(languages -> languages.stream()) /* {lang_a,...,lang_d, lang_e, lang_f} */
.doWhateverWithYourNewStreamHere();
または単に:
dev_team
.stream() /* {dev_1,dev_2,dev_3} */
.flatMap(dev -> dev.getLanguages().stream()) /* {lang_a,...,lang_d, lang_e, lang_f} */
.doWhateverWithYourNewStreamHere();
map()とflatMap()を使用する場合:
map()
ストリームのタイプTの各要素がタイプRの単一の要素にマップ/変換されることになっている場合に使用します。結果は、タイプ(1開始要素-> 1終了要素)とタイプRの要素の新しいストリームのマッピングになります。返されます。
flatMap()
ストリームからのタイプTの各要素がタイプRの要素のコレクションにマップ/変換されることになっている場合に使用します。結果はタイプ(1開始要素-> n終了要素)のマッピングになります。これらのコレクションは、R型の要素の新しいストリームにマージ(またはフラット化)されます。これは、たとえばネストされたループを表す場合に役立ちます。
Java 8より前:
List<Foo> myFoos = new ArrayList<Foo>();
for(Foo foo: myFoos){
for(Bar bar: foo.getMyBars()){
System.out.println(bar.getMyName());
}
}
Java 8以降
myFoos
.stream()
.flatMap(foo -> foo.getMyBars().stream())
.forEach(bar -> System.out.println(bar.getMyName()));
map :: Stream T -> (T -> R) -> Stream R
、flatMap :: Stream T -> (T -> Stream R) -> Stream R
。