1. 4大インターフェースの基本 (1-20)
「4大インターフェース」は、Javaの標準ライブラリ(特にStream API)で最も頻繁に使用されるパーツです。これらを完璧に理解することは、Java Gold試験の合格に直結します。
1番から20番までの項目を、コード例とともに詳しく解説します。
1-5. 4大(+1)インターフェースの型と役割¶
ここがすべての基礎です。「何を受け取り、何を返すか」を暗記してください。
| 項目 | インターフェース | 抽象メソッド | 引数 | 戻り値 | 主な用途 |
|---|---|---|---|---|---|
| 1 | Predicate |
test(T t) |
1 | boolean |
条件判定(filterなど) |
| 2 | Consumer |
accept(T t) | 1 |void` |
処理の実行(forEachなど) | ||
| 3 | Function |
apply(T t) | 1 |R` |
型の変換(mapなど) | ||
| 4 | Supplier |
get() |
0 | T |
値の生成(generateなど) |
| 5 | UnaryOperator |
apply(T t) |
1 | T |
同型変換(replaceAllなど) |
6-8. 定義のルール¶
- **6.
@FunctionalInterface**: これを付けると、メソッドが2つ以上ある場合にコンパイルエラーにしてくれます。 - 7. 抽象メソッドは1つだけ: ただし、
defaultメソッドやstaticメソッドは複数あってもOKです。 - 8. Objectクラスのメソッド:
public boolean equals(Object obj)などを抽象メソッドとして定義しても、「1つ」にはカウントされません。
9-12. ラムダ式の書き方(省略ルール)¶
試験では、どの省略が正しくてどれが不正かを見極める必要があります。
Java
// 9, 10. 型推論(Stringを省略)
Predicate<String> p1 = (s) -> s.isEmpty();
// 11. 引数が1つの場合は () を省略可能
Predicate<String> p2 = s -> s.isEmpty();
// 12. 1文なら {} と return と ; を省略可能
Function<Integer, Integer> f1 = n -> n * 2;
// 失敗例:{} を使うなら return と ; が必須
// Function<Integer, Integer> f2 = n -> { n * 2 }; // コンパイルエラー
13. 変数のスコープ(実質的final)¶
ラムダ式の外にある変数(ローカル変数)を中で使う場合、その変数は変更してはいけません。
Java
int num = 10;
Consumer<Integer> c = (n) -> System.out.println(n + num);
// num = 20; // ここで変更すると、上のラムダ式でコンパイルエラーになる
14-15. メソッド参照¶
ラムダ式をさらに短く書く方法です。
Java
// 14. メソッド参照
Consumer<String> printer = System.out::println; // (s) -> System.out.println(s) と同じ
// 15. 構築参照(コンストラクタ)
Supplier<List<String>> listGen = ArrayList::new; // () -> new ArrayList<>() と同じ
16-20. デフォルトメソッド(条件の結合と連鎖)¶
インターフェース自体が持っている、便利な組み合わせ機能です。
Java
Predicate<String> startA = s -> s.startsWith("A");
Predicate<String> endZ = s -> s.endsWith("Z");
// 16, 17, 18. Predicateの結合
Predicate<String> combined = startA.and(endZ); // Aで始まり、かつZで終わる
Predicate<String> or = startA.or(endZ); // Aで始まる、またはZで終わる
Predicate<String> notA = startA.negate(); // Aで始まらない
// 19, 20. Functionの連鎖
Function<String, Integer> length = s -> s.length();
Function<Integer, String> result = n -> "結果: " + n;
// andThen: Aの後にBを実行
Function<String, String> fAndThen = length.andThen(result); // "Apple" -> 5 -> "結果: 5"
// compose: Bの前にAを実行(中身を先に評価)
Function<String, String> fCompose = result.compose(length); // 同じく "結果: 5"
💡 Java Gold 試験対策のポイント¶
試験では、「戻り値があるはずなのに void の Consumer を使っていないか?」**や、「Predicate なのに boolean 以外を返していないか?」**といった、型の不一致を突く問題が多く出ます。
この「4大インターフェース」の型をマスターすれば、Stream APIの問題の半分は解けたも同然です!
次は、引数が2つになる 「2. 2引数(Bi)シリーズ (21-40)」 に進みますか?それともこの範囲の練習問題を出しましょうか?