1. 導入:BiPredicateでコードをより簡潔に
Javaのプログラミングにおいて、条件判定は避けて通れません。例えば、「ユーザーIDと年齢の両方が条件を満たすか確認したい」といった場面で、if文をネストさせていませんか?
Java 8から導入された BiPredicate を使うと、2つの引数を受け取って真偽値を返すロジックを、関数としてスマートに記述できます。コードの可読性を高め、再利用可能な判定ロジックを作成するために、このインターフェースは非常に重要です。
2. 基礎知識:BiPredicateとは何か
BiPredicate
・T: 第1引数の型
・U: 第2引数の型
このインターフェースは test(T t, U u) という抽象メソッドを1つだけ持っています。
関数型インターフェースであるため、ラムダ式((t, u) -> { … })を使って、匿名クラスを書くよりも圧倒的に短い記述でインスタンス化できるのが特徴です。
3. 実装/解決策:メソッドの組み合わせ
BiPredicateには、判定結果を組み合わせるための便利なデフォルトメソッドが用意されています。
・test(T t, U u): 条件を評価し、booleanを返します。
・and(BiPredicate): 「かつ」の論理積を作成します。
・or(BiPredicate): 「または」の論理和を作成します。
・negate(): 条件を反転(not)させます。
これらを使うことで、複雑な条件式を小さな関数の組み合わせとして組み立てることが可能です。
4. サンプルプログラム
以下のコードは、商品の在庫数と価格を判定する例です。コピーして実行してみてください。
import java.util.function.BiPredicate;
public class BiPredicateExample {
public static void main(String[] args) {
// 1. 在庫が10個以上という条件
BiPredicate hasStock = (stock, price) -> stock >= 10;
// 2. 価格が5000円以下という条件
BiPredicate isCheap = (stock, price) -> price <= 5000;
// 3. 両方の条件を満たすか(and)
BiPredicate isRecommended = hasStock.and(isCheap);
int stockCount = 15;
int price = 3000;
// 判定実行
if (isRecommended.test(stockCount, price)) {
System.out.println("この商品は推奨品です。");
} else {
System.out.println("対象外の商品です。");
}
// 4. 条件の反転(negate): 推奨品ではない場合
if (isRecommended.negate().test(stockCount, price)) {
System.out.println("現在、推奨対象ではありません。");
}
}
}
5. 応用・注意点:現場で役立つポイント
・再利用性を意識する
BiPredicateを定数(static final)として定義しておくと、プロジェクト内で共通のバリデーションロジックとして使い回せます。
・デバッグの難しさ
ラムダ式は非常に便利ですが、複雑なロジックを1行で書きすぎるとデバッグ時にどこで失敗したか分かりにくくなります。条件が複雑になる場合は、メソッド参照を利用して、意味のある名前をつけたメソッドに切り出すことをお勧めします。
・nullチェック
testメソッドに渡す引数がnullである可能性がある場合、ラムダ式の内部でNullPointerExceptionが発生しないよう、事前にガード節を入れるか、Optionalを活用する設計を心がけてください。

コメント