JavaのStream APIは便利な機能を提供しますが、flatMap
とmap
はしばしば混同されることがあります。これらの違いについて説明します。
flatMapとmapの基本的な違い
map
map
は各要素に対して指定された関数を適用し、新しい要素を生成します。これにより、各要素が1対1の関係で変換されます。
List<String> words = Arrays.asList("Hello", "World");
List<Integer> wordLengths = words.stream()
.map(String::length)
.collect(Collectors.toList());
// wordLengths: [5, 5]
上記の例では、各単語の長さが取得され、新しいリストが生成されます。
flatMap
一方で、flatMap
は各要素に対して指定された関数を適用し、その結果として得られる各要素のストリームを1つのストリームに平坦化します。これは、1対多または多対多の関係を扱うのに適しています。
List<List<Integer>> numbers = Arrays.asList(
Arrays.asList(1, 2),
Arrays.asList(3, 4),
Arrays.asList(5, 6));
List<Integer> flattenedNumbers = numbers.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
// flattenedNumbers: [1, 2, 3, 4, 5, 6]
上記の例では、各リストの要素が平坦化され、1つのリストになります。
どちらを使うかの選択基準
map
は要素を変換する際に1対1の関係が維持される場合に使用します。flatMap
は1対多や多対多の関係を持つ場合に使用します。例えば、リスト内のリストを平坦化するなどの場面で有用です。
これらの違いを理解することで、Stream APIをより効果的に使用できるようになります。