confusión en java 8 método de referencia para la implementación del método es igual con BiPredicate

JPG:

Estaba practicando mis habilidades de Java 8. Me encontré con un código extraño (para mí). Tengo mi clase de bean Personcon anulado equalsmétodo. Luego trató de poner en práctica BiPredicatecon el método de igual a igual. Se ejecutó correctamente. ¿Puede alguien explica cómo es que possible..because en mi opinión es igual método toma 1 argumento y de BiPridicate testmétodo toma dos argumentos. ¿Cómo se satisface esta condición?

Mi código--

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);
     }

}

Persona

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()acepta un único parámetro. Es correcto. Pero aquí tu introducido una función que acepta tanto el objeto de comparar ( this) y el parámetro esperado para equals(el otro objeto).
Así que hay un BiPredicate<Person,Person>dejar pasar tanto la información.

Creo que el origen de la confusión es la referencia al método:

checkHere(Person::equals); 

Convertirlo en un lambda, que debe hacer las cosas más claras: (o1, o2) -> o1.equals(o2)

Si lo necesitas necesita pasar dos argumentos a la función que le permita sustituir o1y o2y se hace eso:

return pc.test(p1, p2);

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=229325&siteId=1
Recomendado
Clasificación