8章5と6

このJavaコードのコメントアウト版は以下の通りです。答えがA、つまりPredicate<Sample>である理由も説明します。

import java.util.Arrays;
import java.util.List;
import java.util.function.*; public class Main { public static void main(String[] args) { // Sampleオブジェクトのリストを作成 List<Sample> list = Arrays.asList( new Sample(10), new Sample(20), new Sample(30)); // xに対してtestメソッドを適用し、条件を満たすかチェック if (x.test(new Sample(20))) { System.out.println("ok"); } }
} // Sampleクラスの定義
class Sample { private int num; // Sampleの数値を保持するフィールド public Sample(int num) { this.num = num; // コンストラクタで数値を初期化 } // オブジェクトが等しいかどうかを評価するequalsメソッド public boolean equals(Object obj) { // オブジェクトがSample型ではない場合、falseを返す if (obj instanceof Sample == false) { return false; } // 数値が同じであればtrueを返す if (this.num == ((Sample)obj).num) { return true; } // 上記の条件に合致しない場合はfalseを返す return false; }
}
Enter fullscreen mode
Exit fullscreen mode

A. Predicate<Sample> x = s -> list.contains(s);
これが正しい答えです。Predicateは、引数を取って何らかの条件で評価を行い、boolean値を返す関数型インタフェースです。ここでは、与えられたSampleオブジェクトがリストに含まれているかどうかを確認しています。testメソッドはこの確認を行い、new Sample(20)がリストに含まれているかどうかを評価します。含まれていればtrueを返し、mainメソッド内のifステートメントで”ok”が出力されます。

その他の選択肢は以下の理由で不適切です:

B. Supplier<Sample> は結果を供給するが、条件をテストしない。
C. Consumer<Sample> は引数を消費するが、何かを戻すわけではなくテストもしない。
D. Function<Sample> は一つの型から別の型への変換を行うが、単に条件をテストするだけではない。

追記

画像内のテキストは以下の通りです:

[関数型インタフェースの特徴]

関数型インタフェース メソッド 説明
Consumervoid accept(T)引数を受け取って処理をする。結果を戻さない、引数の「消費者」
SupplierT get()何も受け取らずに結果だけを戻す「供給者」
Predicateboolean test(T)引数を受け取ってそれを評価する「断定」
FunctionR apply(T)引数を受け取って、指定された型(R) の結果を戻す「処理」

ポイント

極簡単なコツをお伝えします。このJavaのコードにおいて、正しい関数型インタフェースを選ぶためには、以下のステップに従うとよいでしょう:

  1. メソッドのシグネチャを理解する:

    • boolean test(T t):何かを受け取り、booleanの結果を返す(Predicate)。
    • T get():何も受け取らずに、何かを返す(Supplier)。
    • void accept(T t):何かを受け取り、返り値がない(Consumer)。
    • R apply(T t):何かを受け取り、別の型の何かを返す(Function)。
  2. コードが何を求めているかを理解する:

    • この場合、if (x.test(new Sample(20))) { ... } は、xが何かの条件をテストしていることを示しています。
  3. メソッドのシグネチャとコードの要求を照合する:

    • コードがテストを行っているので、返り値の型がbooleanである関数型インタフェースを探します。
    • test(T t)メソッドを持つのはPredicateインタフェースだけです。

この3ステップにより、選択肢AがPredicate<Sample>である理由がわかります。なぜなら、list.contains(s)boolean値を返し、これはPredicatetestメソッドの契約に合致しているからです。他のインタフェースは、この使用方法に合致しないシグネチャを持っています。


Discover more from Coursity

Subscribe to get the latest posts sent to your email.

Leave a Comment

Your email address will not be published. Required fields are marked *

Discover more from Coursity

Subscribe now to keep reading and get access to the full archive.

Continue reading

Scroll to Top
This includes providing resources and support for anyone looking to optimize their use of our cloud data storage solutions. Install docker compose ubuntu. Privacy, cookie & data policy.