Java Gold SE17のStream APIでは、distinct()・sorted()・limit() のような中間操作の実行順序がよく問われます。
コード自体は短くても、「どの順番で処理されるのか」を正しく追えないと、選択肢をかなり迷いやすいです。
この記事では、Java Gold SE17対策として押さえておきたいStreamの問題を1問出し、解き方を順番に解説します。
Java Goldでは、Stream APIを暗記で解くよりも「パイプラインを前から追う力」が重要です。
この記事でわかること
distinct()・sorted()・limit()の処理順- Streamの中間操作と終端操作の違い
- Java GoldでStream問題を解くときの考え方
- 引っかけ選択肢を避けるポイント
Java Gold SE17でStream APIが重要な理由
Java Gold SE17、正式にはOracle Certified Professional: Java SE 17 Developer試験では、Stream APIを含むJava標準APIの理解が求められます。
特にStream APIは、次のような問題が出やすいです。
| 出題されやすい論点 | よくある引っかけ |
|---|---|
| 中間操作と終端操作 | 終端操作がないのに処理されると思ってしまう |
map() / filter() |
実行順序を行単位ではなく操作単位で考えてしまう |
distinct() |
重複判定のタイミングを間違える |
sorted() |
ソート前後の要素順を混同する |
limit() |
どの段階で件数制限されるかを間違える |
今回は、この中でも混乱しやすい distinct()・sorted()・limit() を扱います。
問題
次のコードを実行した結果として正しいものはどれでしょうか。
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> names = List.of(
"silver",
"gold",
"bronze",
"gold",
"oracle",
"java"
);
names.stream()
.distinct()
.sorted()
.limit(3)
.forEach(System.out::println);
}
}
選択肢
A.
silver
gold
bronze
B.
bronze
gold
java
C.
bronze
gold
gold
D.
gold
bronze
oracle
正解
正解は B です。
bronze
gold
java
解説
この問題は、Streamの処理を次の順番で追うと解きやすいです。
- 元のリストを確認する
distinct()で重複を取り除くsorted()で自然順序に並び替えるlimit(3)で先頭3件に絞るforEach()で出力する
順番に見ていきます。
1. 元のリストを確認する
元のリストは次の6要素です。
silver
gold
bronze
gold
oracle
java
ここで gold が2回登場しています。
Java Goldの問題では、このような重複要素がある場合、distinct() の有無を必ず確認しましょう。
2. distinct()で重複を取り除く
distinct() は、Stream内の重複要素を取り除く中間操作です。
今回の場合、2回目の gold が除外されます。
distinct() の後は次の状態です。
silver
gold
bronze
oracle
java
この時点では、まだ元の出現順が維持されています。
distinct()は重複を取り除きますが、この問題では並び替えまでは行いません。
3. sorted()で自然順序に並び替える
次に sorted() が実行されます。
String の自然順序では、アルファベット順に並びます。
bronze
gold
java
oracle
silver
ここで注意したいのは、sorted() が limit(3) より前に書かれていることです。
つまり、先に全体を並び替えてから、後で先頭3件を取り出します。
4. limit(3)で先頭3件に絞る
limit(3) は、Streamの先頭から3要素だけを残します。
sorted() 後の状態は次の通りでした。
bronze
gold
java
oracle
silver
この先頭3件を取り出すので、結果は次のようになります。
bronze
gold
java
5. forEach()で出力する
最後に forEach(System.out::println) が実行され、各要素が出力されます。
bronze
gold
java
したがって、正解は B です。
なぜAは間違いなのか
Aは、元のリストの先頭3件をそのまま出力したような選択肢です。
silver
gold
bronze
しかし、実際には limit(3) の前に distinct() と sorted() が実行されます。
そのため、元のリストの先頭3件がそのまま出力されるわけではありません。
なぜCは間違いなのか
Cには gold が2回出てきます。
bronze
gold
gold
しかし、コードでは distinct() が使われています。
distinct() によって重複した gold は取り除かれるため、gold が2回出力されることはありません。
なぜDは間違いなのか
Dは、distinct() 後の一部を何となく取り出したような選択肢です。
gold
bronze
oracle
ただし、sorted() によってアルファベット順に並び替えられるため、この順番にはなりません。
Stream問題では、選択肢に「元の順序っぽいもの」と「ソート後っぽいもの」が混ざっていることがあります。
Java Goldで狙われるポイント
この問題で押さえるべきポイントは、次の4つです。
| メソッド | 種類 | この問題での役割 |
|---|---|---|
distinct() |
中間操作 | 重複した gold を取り除く |
sorted() |
中間操作 | 要素を自然順序で並び替える |
limit(3) |
中間操作 | 先頭3件だけに絞る |
forEach() |
終端操作 | Streamを処理して出力する |
特に重要なのは、forEach() が終端操作であることです。
Streamは、中間操作を書いただけでは実行されません。
names.stream()
.distinct()
.sorted()
.limit(3);
このように終端操作がない場合、Streamの処理は完了しません。
Java Goldでは、forEach()・collect()・count()・findFirst() などの終端操作があるかどうかも必ず確認しましょう。
よくある勘違い
limit()が最初に効くと思ってしまう
今回のコードでは、limit(3) は最後の中間操作として書かれています。
.distinct()
.sorted()
.limit(3)
そのため、先に重複削除とソートが行われ、その後に先頭3件へ絞られます。
もし順番が次のように変わると、結果も変わります。
names.stream()
.limit(3)
.distinct()
.sorted()
.forEach(System.out::println);
この場合、まず元のリストから先頭3件を取り出します。
silver
gold
bronze
そこから重複を取り除き、ソートするため、結果は次のようになります。
bronze
gold
silver
同じメソッドを使っていても、書く順番が変わると結果も変わる点に注意しましょう。
Java Gold SE17本番でこの問題が出たときの解き方
Java Gold SE17の本番では、Stream APIの問題を見た瞬間にメソッド名だけで判断しないことが大切です。特に distinct()、sorted()、limit() のような中間操作が複数つながっている場合は、上から順番に処理結果を書き出すとミスを減らせます。
今回の問題では、まず distinct() で重複した gold が取り除かれます。そのあとに sorted() でアルファベット順に並び替えられ、最後に limit(3) で先頭3件だけが残ります。
つまり、ポイントは「元のリストの先頭3件」ではなく、「重複削除とソートが終わったあとの先頭3件」を答えることです。
Java GoldのStream問題では、このように 処理の途中経過を1つずつ書き出す だけで、選択肢の引っかけにかなり気づきやすくなります。
あわせて確認したいJava Gold対策記事
Stream APIだけでなく、Java Gold SE17全体の勉強法を知りたい方は、先に Java Gold SE17対応 勉強法ロードマップ を確認しておくと、どの順番で対策すべきか整理しやすいです。
また、Java Goldの難易度や必要な勉強時間を知りたい方は、Java Goldの難易度と勉強時間を解説した記事 も参考になります。
問題演習を増やしたい場合は、Java Gold SE17無料問題10選 もあわせて使ってみてください。
公式ドキュメントで確認するポイント
Stream APIの仕様を正確に確認したい場合は、Oracle公式の Java SE 17 Stream APIドキュメント を見るのが確実です。
また、Java Gold SE17の試験範囲を確認したい方は、Oracleの Java SE 17 Developer試験ページ もチェックしておきましょう。
実務目線での補足
実務でも、Streamの操作順は読みやすさと性能の両方に影響します。
たとえば大量データを扱う場合、先に filter() や limit() で件数を絞れるなら、後続処理の負荷を下げられることがあります。
一方で、今回のように「ソート後の先頭3件」が欲しい場合は、sorted() の後に limit() を書く必要があります。
Java Goldの試験では、性能改善というよりも、まずは コードに書かれた順番通りに結果を追えるか が問われます。
まとめ
今回の問題では、次のコードの実行結果を確認しました。
names.stream()
.distinct()
.sorted()
.limit(3)
.forEach(System.out::println);
処理の流れは次の通りです。
distinct()で重複を取り除くsorted()で自然順序に並び替えるlimit(3)で先頭3件に絞るforEach()で出力する
最終的な出力は次の通りです。
bronze
gold
java
Java Gold SE17のStream API問題では、メソッド名だけで判断せず、中間操作の順番と終端操作の有無を必ず確認しましょう。
関連記事
- Java Gold SE17の難易度はどれくらい?勉強時間と合格ラインを解説
- Java Gold SE17は黒本だけで合格できる?おすすめ問題集と勉強法
- Java Goldに落ちる人の特徴と対策
- Java Gold SE17 無料問題集
Java Gold SE17の問題演習をもっとしたい方へ
Java Gold SE17の問題演習をもっとしたい方は、無料問題集もあわせて使ってみてください。
理解したら、問題で確認
Java Gold SE17のコード読解問題に挑戦する
この記事で学んだ内容を、Java Gold SE17向けの問題演習アプリで復習できます。 カテゴリ別問題と60問の模擬試験を、登録不要で利用できます。
Java Gold問題を解く →
コメント