DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

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> は一つの型から別の型への変換を行うが、単に条件をテストするだけではない。

追記

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

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

関数型インタフェース  メソッド  説明
Consumer void accept(T) 引数を受け取って処理をする。結果を戻さない、引数の「消費者」
Supplier T get() 何も受け取らずに結果だけを戻す「供給者」
Predicate boolean test(T) 引数を受け取ってそれを評価する「断定」
Function R 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メソッドの契約に合致しているからです。他のインタフェースは、この使用方法に合致しないシグネチャを持っています。

Top comments (0)