BiPredicateとequalsメソッドの実装のために参照するJava 8の方法で混乱

JPG:

私はJavaの8スキルを練習していました。私は奇妙な(私にとっては)コードに出くわしました。私は私のBeanクラスを持っているPersonオーバーライドされたとequalsする方法。そして、私が実装しようとしたBiPredicateequalsメソッドで。それが正常に実行されました。缶誰もが私の意見でpossible..becauseはメソッドが1つの引数を取り、BiPridicateのと等しいことです方法を説明testする方法は2つの引数を取ります。それはどのようにこの条件を満たしていますか?

マイcode--

Method_Ref1

package method_referencing;

import java.util.function.BiPredicate;
import method_referencing.Person;

//1. static ....
//2. instance ...
//3. arbitary object 
//4. constructor
public class Method_Ref1 {

    public static void main(String[] args) {

        System.out.println(checkHere(Person::equals));

    }

     static boolean checkHere(BiPredicate<Person,Person> pc) {
         Person p1 = new Person(11,"Tom","Male","coder");
         Person p2 =    new Person(21,"Tom","male","coder");
         return pc.test(p1, p2);
     }

}

package method_referencing;

import java.io.Serializable;

public class Person implements Serializable{

    private static final long serialVersionUID = 5721690807993472050L;
    int id;
    String name;
    String gender;
    String note;

    public Person() {

    }

    public Person(int id, String name, String gender, String note) {
        this.id = id;
        this.name = name;
        this.gender = gender;
        this.note = note;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }

    @Override
    public String toString() {
        return "id=" + id + ", name=" + name + ", gender=" + gender + ", note=" + note + "";
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((gender == null) ? 0 : gender.hashCode());
        result = prime * result + id;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + ((note == null) ? 0 : note.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

}
davidxxx:

Object.equals()単一のパラメーターを受け入れます。それは権利です。しかし、ここであなたを比較するオブジェクトの両方を受け入れる機能(導入this)とのために期待されるパラメータequals(他のオブジェクト)。
だから、必要なBiPredicate<Person,Person>情報の両方を通過させます。

私はあなたの混乱の起源はメソッド参照であることを考えます:

checkHere(Person::equals); 

ラムダに変換し、それは物事が明確に行う必要があります。 (o1, o2) -> o1.equals(o2)

あなたは確かにそれを代用できるようにする機能への2つの引数を渡す必要があるo1o2、あなたはそれを実行します。

return pc.test(p1, p2);

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=229322&siteId=1