Predicate
Java Gold(SE11/17)の取得を目指されているとのこと、素晴らしいですね!Predicate は、関数型インターフェースの中でも頻出かつ、他のインターフェース(Stream や Optional)と組み合わせて多用される非常に重要な概念です。 試験対策として、単なる「真偽値を返すもの」という理解から一歩踏み込んで、メソッド合成や引数の型推論を中心に深掘りしましょう。
- Predicate の基本構造
Predicate
は、引数を1つ取り、boolean を返す関数型インターフェースです。 - 抽象メソッド: boolean test(T t)
- パッケージ: java.util.function
- メソッド合成(デフォルトメソッド) 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
-
特殊な Predicate メソッド 試験で「おや?」と思わせるトリッキーな静的メソッドが2つあります。 isEqual(Object targetRef) 引数と比較して等しいかどうかを判定します。null 安全な比較を行いたいときに便利です。
JavaPredicate<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()); -
プリミティブ型の Predicate パフォーマンス向上のため、オートボクシングを避けるプリミティブ専用のインターフェースが用意されています。これらは Predicate
を継承しているわけではない点に注意してください。 -
IntPredicate: boolean test(int value)
- LongPredicate: boolean test(long value)
- DoublePredicate: boolean test(double value)
試験のポイント: Predicate
と IntPredicate は互換性がありません。キャストや代入の可否を問う問題に注意しましょう。 - 試験対策:ここをチェック!
- 引数の数: Predicate は1つ、BiPredicate
は2つの引数を取ります。 - 戻り値: 必ず boolean(プリミティブ)です。Boolean(ラッパー)を返す関数は Function
になります。 - 短絡評価: and や or で合成された場合、Java の && や || と同様に、結果が確定した時点で評価を止めます。 次は、これらを使った Stream.filter() の応用や、BiPredicate について詳しく解説しましょうか?それとも練習問題を解いてみたいですか?