Stream(flatMap 平坦化)難易度 標準無料
次のコードの出力として正しいものを選べ。
1 import java.util.*;
2 import java.util.stream.*;
3 public class Q4 {
4 public static void main(String[] a) {
5 List<List<Integer>> data =
6 List.of(List.of(1, 2), List.of(3), List.of(4, 5, 6));
7 int sum = data.stream()
8 .flatMap(List::stream)
9 .mapToInt(Integer::intValue)
10 .sum();
11 System.out.println(sum);
12 }
13 }
- A
21 - B
3 - C
6 - Dコンパイルエラー(
flatMapにList::streamを渡せない)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済
解説
map は「1要素→1要素」の変換だが、flatMap は「1要素→0個以上の要素のストリーム」に展開し、それらを1本のストリームへ平坦化(flatten)する。
data は List<List<Integer>>。flatMap(List::stream) により各内側リストが要素ストリームに開かれ、
全体が 1, 2, 3, 4, 5, 6 という単一の Stream<Integer> になる。
mapToInt(Integer::intValue) で IntStream にし、sum() で合計 → 21。
- B内側リストの個数(3)を数えた誤り。
flatMapは各リストを要素に展開するので、合計されるのは全整数(1〜6)。 - C要素の総数(6個)を答えた誤り。求めているのは要素の合計値(1+2+3+4+5+6=21)。
- D
flatMapは「要素→Stream」の関数を取り、List::stream(List<Integer>→Stream<Integer>)は適合する。コンパイルは通る。
ひっかけ:
flatMap の関数は「要素→Stream」を返す必要がある(List::stream のように)。ここで map(List::stream) と書くと Stream<Stream<Integer>>(入れ子のまま)になり平坦化されない。実機確認の答え合わせ
出力: 21
公式ドキュメント・関連Stream.flatMap(SE17 API)↗
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)