回答編集履歴

1 微修正

argius

argius score 9381

2015/06/20 19:26  投稿

`map`が1対1に変換する処理なのに対して、
`flatMap`は1対nの変換です。(nは0以上)
同様に、`map`に適用するラムダ式は、入力と出力の個数は同じですが、
`flatMap`に適用するラムダ式は、入力1に対して、0でも1でもそれ以上でも良いのです。
ただし結果は`Stream`なので、それらを内部で1つの平坦な`Stream`に変換しています。だから`flat`なのです。
ただし結果は`Stream`なので、それらを内部で1つの **平坦な** `Stream`に変換しています。だから名前に`flat`が付いているのです。
例:
```lang-java
// mapに適用するラムダ式
Function<String, String> f1 = x -> "-" + x + "-";
// flatMapに適用するラムダ式(1個から2個へ)
Function<String, Stream<? extends String>> f2 = x -> Stream.of(x, "***");
List<String> a1 = Stream.of("A", "B", "C").map(f1).collect(Collectors.toList());
System.out.println(a1);
// => [-A-, -B-, -C-]
//   3個
List<String> a2 = Stream.of("A", "B", "C").flatMap(f2).collect(Collectors.toList());
System.out.println(a2);
// => [A, ***, B, ***, C, ***]
//   6個
```
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る