Javaにおいて、flatMapとmapの違いは何ですか?
Javaにおいて、flatMapとmapはどちらもストリーム内の要素を変換するためのメソッドですが、それらにはいくつかの違いがあります。
- 戻り値:mapメソッドは、ストリーム内の各要素を新しい値に変換し、それらの新しい値を含むストリームを返します。一方、flatMapメソッドは、ストリーム内の各要素を別のストリームに変換し、それらのストリームを結合して新しいストリームを作成します。
- 「フラットマップ」は、要素をストリームにマッピングするため、複数のストリームを1つにマージするのに使用できます。一方、「マップ」は1対1の要素のマッピングのみを行うことができます。
例を挙げると、複数の文字列を含むストリームがあるとします。私たちはそれぞれの文字列を1文字ずつ分割し、それらの文字を含むストリームを返したいと思っています。それには、flatMapメソッドを使って各文字列を文字のストリームにマップし、これらの文字のストリームを1つのストリームに結合することができます。以下に示すサンプルコードをご覧ください:
List<String> strings = List.of("Hello", "World");
// 使用flatMap将每个字符串映射为字符流,然后将这些字符流合并成一个流
List<Character> characters = strings.stream()
.flatMap(str -> str.chars().mapToObj(c -> (char) c))
.collect(Collectors.toList());
System.out.println(characters); // 输出: [H, e, l, l, o, W, o, r, l, d]
もう一つの方法は、各文字列を大文字に変換したい場合に、マップメソッドを使用して各文字列を大文字の文字列にマッピングし、それらの文字列を含むストリームを返すことができます。例コードは以下の通りです:
List<String> strings = List.of("Hello", "World");
// 使用map将每个字符串映射为大写形式的字符串
List<String> upperCaseStrings = strings.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(upperCaseStrings); // 输出: [HELLO, WORLD]
以上の説明から、flatMapは複数のストリームを1つのストリームにマージするために使用され、一方、mapは1対1の要素マッピングを行うために使用されます。