※本記事は、Simon RobertsとMikalai Zaikinによる”Quiz Yourself: Using Core Functional Interfaces: Predicate (Advanced)“を翻訳したものです。
Predicateインタフェースは複雑になることがあるため、その結果を扱う場合は十分に注意を
著者:Simon Roberts、Mikalai Zaikin
2020年4月6日
その他の設問はこちらから
Predicate、Consumer、Function、Supplierなどのコア関数型インタフェースを使いたいと思います。この設問では、条件に注目します。
次のコードについて:
Predicate<Integer> p1 = (i1) -> i1 > 9; Predicate<Integer> p2 = (i2) -> i2 % 2 == 0; Predicate<Integer> p3 = (i3) -> i3 > 19; boolean result = p1.and(p2.negate()).and(Predicate.not(p3)).test(i);
次の引数のうち、結果がtrueになるのはどれですか。2つ選んでください。
| A. 9 | |
| B. 10 | |
| C. 11 | |
| D. 19 | |
| E. 21 |
解答:java.util.function.Predicateは、Java 8で導入された関数型インタフェースで、1つのパラメータを受け取ってBooleanを返す、1つの抽象メソッドboolean test(T t)があります。このインタフェースでは当初から、defaultメソッドとしてand(…)、or(…)、negate()が提供されたため、条件を組み合わせることが容易になっています。Java 11では、このインタフェースにstaticメソッドのPredicate.not(Predicate p)が追加されました。このメソッドでは、渡された条件の否定を表す条件が作成されます。
設問には、3つの条件が含まれています。1つ目のp1では、引数が9より大きいかどうかが評価されます。2つ目のp2では、引数が偶数かどうかが評価されます。そして3つ目のp3では、引数が19より大きいかどうかが評価されます。
設問のコードの最終行では、3つの条件が論理ANDで結合されています。1つ目のp1では、値が9より大きいかどうかが確認されます。2つ目はp2を反転させたもので、ここでは奇数かどうかが確認されます。3つ目では、値が19以下かどうかが確認されます(「19より大きい」を否定、つまり反転させたものです)。
すべての条件を満たすのは、選択肢CとDのみです。いずれのパラメータも9より大きく、奇数であり、19以下です。
正解は選択肢CとDです。
選択肢Aは、パラメータが9より大きいかどうかが評価される、最初の条件チェックで失敗します。したがって、選択肢Aは誤りです。
選択肢Bは、パラメータが奇数かどうかが評価される、2つ目の条件チェックで失敗します。したがって、選択肢Bは誤りです。
選択肢Eは、パラメータが19以下かどうかが評価される、3つ目の条件チェックで失敗します。したがって、選択肢Eは誤りです。
![]() |
Simon RobertsSimon Roberts:Sun Microsystemsがイギリスで初めてJavaの研修を行う少し前にSunに入社し、Sun認定Javaプログラマー試験とSun認定Java開発者試験の作成に携わる。複数のJava認定ガイドを執筆し、現在はフリーランスでPearson InformITにおいて録画やライブによるビデオ・トレーニングを行っている(直接またはO’Reilly Safari Books Onlineサービス経由で視聴可能)。OracleのJava認定プロジェクトにも継続的に関わっている。 |
![]() |
Mikalai ZaikinMikalai Zaikin:ベラルーシのミンスクを拠点とするIBA IT ParkのリードJava開発者。OracleによるJava認定試験の作成に携わるとともに、複数のJava認定教科書のテクニカル・レビューを行っている。Kathy Sierra氏とBert Bates氏による有名な学習ガイド『Sun Certified Programmer for Java』では、3版にわたってテクニカル・レビューを務めた。 |


