Streamのコードを読む4つの観点
- 生成時の型を確認する。
Stream<Integer>とIntStreamは別の型です。途中のmap・mapToInt・boxedによって、次に使えるメソッドが変わります。 - 中間操作と終端操作を分ける。
filterやmapは処理を組み立てる中間操作です。終端操作がないだけでコンパイルエラーになるわけではありません。 - 要素が通過する順序を追う。
sorted().limit(2)とlimit(2).sorted()では、並べ替える対象が変わります。各段階で残る要素を書き出してください。 - 終端操作の後は再利用しない。もう一度処理する場合は、元のコレクションなどから新しいStreamを作ります。
間違えやすい違い
| 組み合わせ | 確認する点 |
|---|---|
filter / takeWhile | 順序付きStreamでは、filterは条件に合う要素を選び、takeWhileは先頭から条件を満たす部分を取ります。 |
map / flatMap | 各要素を変換するのか、各要素から作ったStreamを平坦化するのかを区別します。 |
findFirst / get | findFirstが返すOptionalが空かどうかを確認します。空のOptionalにgetを呼ぶと例外になります。 |
peekなどの副作用が必ず実行されると決めつけないでください。結果を変えない処理は最適化で省略される場合があります。仕様はJava SE 17のStream APIで確認できます。
例題2問:遅延評価と再利用
正解だけでなく、不正解の選択肢がどの規則と矛盾するかも考えてから解説を開いてください。
例題1:中間操作と遅延評価
Streamパイプラインの実行モデルについて、正しい説明を2つ選んでください。
2つ選択してください
- A.
終端操作を書かないコードでもコンパイルは可能 - B.
parallelへ変更すればどの副作用の順序も順次処理と一致する - C.
countの呼び出しは元のListから要素を削除する - D.
filterを追加しただけでは通常その述語は実行されない
例題1の正解・解説を見る
正解:A・D
中間操作は処理の構成を記述し、終端操作が必要に応じて評価を開始します。
中間操作は処理の構成を記述し、終端操作が必要に応じて評価を開始します。
- A:終端操作がないこと自体は構文エラーではありません。
- B:順序依存の副作用の一致は保証されません。
- C:通常の集約は元のコレクションを削除しません。
- D:中間操作は遅延評価されます。
確認するポイント:副作用を使って処理順を推測する場合、短絡や最適化も考慮します。
仕様を確認するための公式資料:
問題ID:jg17-ff453db5d07383 · この問題の訂正を連絡する
例題2:終端操作後の再利用
次の処理が最後に表示する内容を選んでください。必要なimportは記述済みです。
var s = Stream.of("oak", "elm");
System.out.print(s.count() + ":");
try { s.findFirst(); }
catch (IllegalStateException e) { System.out.print("used"); }
1つ選択してください
- A.
0:used - B.
2:Optional[oak] - C.
2:oak - D.
2:used
例題2の正解・解説を見る
正解:D
正解は「2:used」です。
countで消費したStreamはfindFirstで再利用できず、IllegalStateExceptionを捕捉します。
- A:この結果にはなりません。countで消費したStreamはfindFirstで再利用できず、IllegalStateExceptionを捕捉します。
- B:この結果にはなりません。countで消費したStreamはfindFirstで再利用できず、IllegalStateExceptionを捕捉します。
- C:この結果にはなりません。countで消費したStreamはfindFirstで再利用できず、IllegalStateExceptionを捕捉します。
- D:countで消費したStreamはfindFirstで再利用できず、IllegalStateExceptionを捕捉します。
確認するポイント:終端操作後に同じ変数へ別の終端操作をつなげられません。
仕様を確認するための公式資料:
問題ID:jg17-a7759dc18e37a3 · この問題の訂正を連絡する
Stream APIの82問で復習する
Gold 17の問題演習を開き、「出題分野」で「JavaストリームAPI」を選びます。遅延評価・型変換・集約・Optionalなどから苦手な問題を確認してください。82問は本サイトの収録数で、試験の出題比率ではありません。
解き直す際は、正解の番号を覚えるより「型が合わない」「終端操作済み」「空になる可能性がある」のように根拠を言葉にします。演算順序の例はsortedとdropWhileの例題でも確認できます。
次に取り組む学習
- コレクションとジェネリクスで要素の型を復習する。
- ラムダ式・関数型インターフェースでfilterやmapに渡す処理を確認する。
- Java Gold 17の勉強法・復習計画で学習順序を決める。
- モジュールシステムの解説・例題で公開範囲を整理する。
- 並列処理の解説・例題で開始・待機・終了を区別する。
問題は本試験の過去問ではなく、Java SE 17を学ぶためのオリジナル練習教材です。編集・訂正の方針をご確認ください。