※本記事は、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 Roberts

Simon Roberts:Sun Microsystemsがイギリスで初めてJavaの研修を行う少し前にSunに入社し、Sun認定Javaプログラマー試験とSun認定Java開発者試験の作成に携わる。複数のJava認定ガイドを執筆し、現在はフリーランスでPearson InformITにおいて録画やライブによるビデオ・トレーニングを行っている(直接またはO’Reilly Safari Books Onlineサービス経由で視聴可能)。OracleのJava認定プロジェクトにも継続的に関わっている。

 

Mikalai Zaikin

Mikalai Zaikin:ベラルーシのミンスクを拠点とするIBA IT ParkのリードJava開発者。OracleによるJava認定試験の作成に携わるとともに、複数のJava認定教科書のテクニカル・レビューを行っている。Kathy Sierra氏とBert Bates氏による有名な学習ガイド『Sun Certified Programmer for Java』では、3版にわたってテクニカル・レビューを務めた。