閲覧中:
Predicate

Predicate

Java Gold(SE11/17)の取得を目指されているとのこと、素晴らしいですね!Predicate は、関数型インターフェースの中でも頻出かつ、他のインターフェース(Stream や Optional)と組み合わせて多用される非常に重要な概念です。 試験対策として、単なる「真偽値を返すもの」という理解から一歩踏み込んで、メソッド合成や引数の型推論を中心に深掘りしましょう。

  1. Predicate の基本構造 Predicate は、引数を1つ取り、boolean を返す関数型インターフェースです。
  2. 抽象メソッド: boolean test(T t)
  3. パッケージ: java.util.function
  4. メソッド合成(デフォルトメソッド) Java Gold で最も問われやすいのが、複数の Predicate をつなげるメソッドです。これにより、複雑な条件論理を宣言的に記述できます。
メソッド 説明 論理演算
and(Predicate other) 両方の条件が true の場合に true && (AND)
or(Predicate other) いずれかの条件が true の場合に true `
negate() 結果を反転させる ! (NOT)

コード例:

Java
Predicate<String> startsWithA = s -> s.startsWith("A");
Predicate<String> isLongEnough = s -> s.length() > 5;

// Aで始まり、かつ6文字以上のもの
Predicate<String> combined = startsWithA.and(isLongEnough);

System.out.println(combined.test("Apple"));    // false (短い)
System.out.println(combined.test("Alphabet")); // true

  1. 特殊な Predicate メソッド 試験で「おや?」と思わせるトリッキーな静的メソッドが2つあります。 isEqual(Object targetRef) 引数と比較して等しいかどうかを判定します。null 安全な比較を行いたいときに便利です。

    Java
    Predicate<String> isHello = Predicate.isEqual("Hello");
    isHello.test("Hello"); // true
    
    not(Predicate target) (Java 11以降)
    既存の Predicate を反転させますnegate() と似ていますがメソッド参照をそのまま反転できるためStream API で重宝されます
    // 空文字でないものをフィルタリング
    list.stream()
        .filter(Predicate.not(String::isEmpty))
        .collect(Collectors.toList());
    

  2. プリミティブ型の Predicate パフォーマンス向上のため、オートボクシングを避けるプリミティブ専用のインターフェースが用意されています。これらは Predicate を継承しているわけではない点に注意してください。

  3. IntPredicate: boolean test(int value)

  4. LongPredicate: boolean test(long value)
  5. DoublePredicate: boolean test(double value)

    試験のポイント: Predicate と IntPredicate は互換性がありません。キャストや代入の可否を問う問題に注意しましょう。

  6. 試験対策:ここをチェック!
  7. 引数の数: Predicate は1つ、BiPredicate は2つの引数を取ります。
  8. 戻り値: 必ず boolean(プリミティブ)です。Boolean(ラッパー)を返す関数は Function になります。
  9. 短絡評価: and や or で合成された場合、Java の && や || と同様に、結果が確定した時点で評価を止めます。 次は、これらを使った Stream.filter() の応用や、BiPredicate について詳しく解説しましょうか?それとも練習問題を解いてみたいですか?