4. 応用と試験のひっかけ (71-100)
いよいよ関数型インターフェース編の締めくくりです。ここでは、これまで学んだインターフェースが**「Javaの標準メソッド(List, Map, Optional, Comparator等)」でどう使われるか**、そして**「試験で受験者を惑わす細かい仕様」**を徹底解説します。
71-72. 関数型インターフェースの定義定義¶
- 71. マーカーインターフェース: メソッドが1つもない(例:
Serializable)ものは関数型ではありません。 - 72. メソッド数: 抽象メソッドが2つ以上あれば、ラムダ式を代入できません。
73-75. Collection/Listのメソッド¶
Java
List<String> list = new ArrayList<>(List.of("apple", "banana", "cherry"));
// 73. removeIf(Predicate): 条件に合うものを削除
list.removeIf(s -> s.startsWith("a"));
// 74. replaceAll(UnaryOperator): 全要素を変換して置換
list.replaceAll(s -> s.toUpperCase());
// 75. sort(Comparator): 比較してソート
list.sort((s1, s2) -> s1.length() - s2.length());
76-77, 87-89. Comparatorの進化¶
Comparatorもメソッドが1つの関数型インターフェースです。
Java
// 76, 77. メソッドチェーン
Comparator<String> comp = Comparator.comparing(String::length)
.thenComparing(String::toString);
// 87-89. 逆順とnull処理
Comparator<String> rev = comp.reversed(); // 逆順
Comparator<String> nullSafe = Comparator.nullsFirst(comp); // nullを先頭にする
78-81. Optionalでの活用¶
Optionalは関数型インターフェースの宝庫です。
Java
Optional<String> opt = Optional.of("Java");
// 78. ifPresent(Consumer): 値があれば実行
opt.ifPresent(System.out::println);
// 79. orElseGet(Supplier): 値がなければ生成(引数なし!)
String val = opt.orElseGet(() -> "Default");
// 80. map(Function): 値を変換
Optional<Integer> len = opt.map(String::length);
// 81. filter(Predicate): 条件に合わなければ空にする
opt.filter(s -> s.length() > 5).ifPresent(System.out::println);
82, 97. ラムダ式の制約(例外とスコープ)¶
- 82. 例外:
PredicateやConsumerの抽象メソッドは例外をthrowsしていないため、中でチェック例外(IOException等)を投げる場合は、内部でtry-catchが必須です。 - 97. 変数名の重複:
84. ラムダ式 vs 匿名クラス (this の意味)¶
試験に出る「地味に重要な違い」です。
- 匿名クラス:
thisはその「匿名クラスのインスタンス」を指す。 - ラムダ式:
thisはラムダを「囲んでいるクラスのインスタンス」を指す。
85-86. メソッド参照の分類¶
String::toUpperCase: 任意のオブジェクト(引数がレシーバになる)。Function<String, String>に相当。System.out::println: 特定のオブジェクト。Consumer<String>に相当。
90-93. Streamでの生成と終端¶
- 90. generate(Supplier): 無限に値を生成。
- 91. iterate(seed, UnaryOperator): 前の値を使って次を生成。
- 92. allMatch(Predicate): 全てが条件を満たすか。
95-96. Mapの高度な操作¶
Java
Map<String, Integer> map = new HashMap<>();
// 95. computeIfAbsent(K, Function): キーがなければ計算して追加
map.computeIfAbsent("Java", s -> s.length());
// 96. merge(K, V, BiFunction): 値を統合
map.merge("Java", 1, (oldVal, newVal) -> oldVal + newVal);
💡 Java Gold 試験対策:最後のひっかけポイント100¶
identity()メソッド:Function.identity()はs -> sと同じです。map()等で「何も変えたくない」時に使われます。Predicate.isEqual():Predicate.isEqual("test").test(obj)はobj.equals("test")と同じです。- インターフェースの互換性: 引数と戻り値の型が一致していれば、独自のインターフェースでもラムダ式を受け取れます。
これですべての「100本ノック」が終了しました! 並列処理、Stream API、関数型インターフェースの3本柱を網羅したことになります。
合格への総仕上げとして、何をしましょうか?
- A. 総合模試: これまでの2分野(または3分野)を混ぜた全20問程度のミニテスト。
- B. 苦手分野の補強: 「今の解説の中でここが一番ピンとこなかった」という部分の再解説。
- C. 次の分野へ: JDBC(データベース)や NIO.2(ファイル操作)などのノックを開始。
どちらに進みますか?