Skip to content
閲覧中:
4. 応用と試験のひっかけ (71-100)

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. 例外: PredicateConsumerの抽象メソッドは例外をthrowsしていないため、中でチェック例外(IOException等)を投げる場合は、内部でtry-catchが必須です。
  • 97. 変数名の重複:
    Java
    int x = 10;
    // Consumer<Integer> c = (x) -> ...; // コンパイルエラー!外側の変数名と同じはNG
    

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

  1. identity() メソッド: Function.identity()s -> s と同じです。map()等で「何も変えたくない」時に使われます。
  2. Predicate.isEqual(): Predicate.isEqual("test").test(obj)obj.equals("test") と同じです。
  3. インターフェースの互換性: 引数と戻り値の型が一致していれば、独自のインターフェースでもラムダ式を受け取れます。
    Java
    interface MyFunc { boolean check(String s); }
    MyFunc f = s -> s.isEmpty(); // これは有効!
    

これですべての「100本ノック」が終了しました! 並列処理、Stream API、関数型インターフェースの3本柱を網羅したことになります。

合格への総仕上げとして、何をしましょうか?

  • A. 総合模試: これまでの2分野(または3分野)を混ぜた全20問程度のミニテスト。
  • B. 苦手分野の補強: 「今の解説の中でここが一番ピンとこなかった」という部分の再解説。
  • C. 次の分野へ: JDBC(データベース)や NIO.2(ファイル操作)などのノックを開始。

どちらに進みますか?