概要
Predicateはtestメソッド持つ関数型インターフェースです。
引数を1つ受け取り、booleanを返します。
基本的な使い方
test(T t)には、ジェネリクスに指定する型を引数として与えます。
ラムダ式にはbooleanを返すための評価式を記述します。
以下では、正数をtrueとして返しています。
1 2 3 4 5 |
Predicate<Integer> positiveNumber = num -> num > 0; System.out.println(positiveNumber.test(1)); // true System.out.println(positiveNumber.test(0)); // false |
その他のメソッド
Predicateには3つのdefaultメソッドと1つのstaticメソッドがあります。
and
defaultメソッドの1つです。
他のPredicateとの論理積の結果を返します。
以下では、10以上かつ20以下の結果を評価しています。
1 2 3 4 5 6 7 8 |
Predicate<Integer> moreThanTen = num -> num >= 10; Predicate<Integer> lessThanTwenty = num -> num <= 20; System.out.println(moreThanTen.and(lessThanTwenty).test(10)); // true System.out.println(moreThanTen.and(lessThanTwenty).test(20)); // true System.out.println(moreThanTen.and(lessThanTwenty).test(9)); // false System.out.println(moreThanTen.and(lessThanTwenty).test(21)); // false |
or
defaultメソッドの1つです。
他のPredicateとの論理和の結果を返します。
以下では、40以上または30以下の結果を評価しています。
1 2 3 4 5 6 7 8 |
Predicate<Integer> moreThanFourty = num -> num >= 40; Predicate<Integer> lessThanThirty = num -> num <= 30; System.out.println(lessThanThirty.or(moreThanFourty).test(30)); // true System.out.println(lessThanThirty.or(moreThanFourty).test(40)); // true System.out.println(lessThanThirty.or(moreThanFourty).test(31)); // false System.out.println(lessThanThirty.or(moreThanFourty).test(39)); // false |
nagete
defaultメソッドの1つです。
Predicateの評価を否定した結果を返します。
以下では、10に一致する結果を否定しています。
1 2 3 4 5 |
Predicate<Integer> isTen = num -> num == 10; System.out.println(isTen.negate().test(10)); // false System.out.println(isTen.negate().test(9)); // true |
isEauls
staticメソッドです。
Objects.equals(Object, Object)で評価します。
お互いのオブジェクトが等しい場合のみtrueを返します。
もし引数がnullの場合、nullが評価対象であればtrueを返します。
1 2 3 4 5 6 7 8 9 |
Predicate<Integer> isHandred = Predicate.isEqual(100); System.out.println(isHandred.test(100)); // true System.out.println(isHandred.test(101)); // false Predicate<Integer> isNull = Predicate.isEqual(null); System.out.println(isNull.test(null)); // true System.out.println(isNull.test(100)); // false |
Predicateの特殊化された他のインターフェース
BiPredicate
testメソッドが2つの引数を持つように特殊化されたPredicateのインターフェースです。
1 2 3 4 5 6 7 |
BiPredicate<Integer, Integer> betweenZeroAndTen = (start, end) -> start >= 0 && end <= 10; System.out.println(betweenZeroAndTen.test(0, 10)); // true System.out.println(betweenZeroAndTen.test(0, 11)); // false System.out.println(betweenZeroAndTen.test(-1, 10)); // false |
IntPredicate
testメソッドの引数の型がintに特殊化されたPredicateのインターフェースです。
ジェネリクスの型の指定は不要です。
1 2 3 4 5 |
IntPredicate isOne = num -> num == 1; System.out.println(isOne.test(1)); // true System.out.println(isOne.test(0)); // false |
DoublePredicate
testメソッドの引数の型がdoubleに特殊化されたPredicateのインターフェースです。
ジェネリクスの型の指定は不要です。
※コードはIntPredicateと同様のため割愛
LongPredicate
testメソッドの引数の型がlongに特殊化されたPredicateのインターフェースです。
ジェネリクスの型の指定は不要です。
※コードはIntPredicateと同様のため割愛
Javaの資格試験対策
押さえるべき点は、以下の2点です。
・Predidateはどんな目的を持っている関数型インターフェースか?
⇒概要をご確認ください。
・testメソッドの使い方
⇒基本的な使い方をご確認下さい。
and、or、nagete、isEqualsメソッドや、特殊化されたBiPredidateなどは黒本を見た限り出てこなかったので、おそらくそこまで突っ込んだ試験は出てこないと思われます。
まとめ
- Predicateはtestメソッド持つ関数型インターフェースで、引数を1つ受け取ってbooleanを返します。
- defaultメソッドにand・or・nageteを持ち、論理積・論理和・否定を評価できる。
- staticメソッドにisEqualsを持ち、Object.equals(Object, Object)の比較を行える。
- 他にも特殊化されたインターフェースが利用できる。
参考情報
インタフェースPredicate
パッケージjava.util.function