Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

confusion in java 8 method referencing for equals method implementation with BiPredicate

Tags:

java

java-8

I was practicing my Java 8 skills. I came across a strange (for me) code. I have my bean class Person with overridden equals method. Then I tried to implement BiPredicate with equals method. It ran successfully. Can anyone explains how's that possible..because in my opinion equals method takes 1 argument and BiPridicate's test method takes two arguments. How is it satisfying this condition?

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

}

Person

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

}
like image 626
JPG Avatar asked Jul 19 '19 05:07

JPG


People also ask

What is a method reference in Java 8?

Java provides a new feature called method reference in Java 8. Method reference is used to refer method of functional interface. It is compact and easy form of lambda expression. Each time when you are using lambda expression to just referring a method, you can replace your lambda expression with method reference.

What is predicate and BiPredicate in Java?

Predicate is a functional interface in Java that accepts a single input and can return a boolean value. BiPredicate is a functional interface in Java that accepts two inputs and can return a boolean value. Predicate and BiPredicate are usually used to apply in a filter for a collection of objects.

Which of the following operators is used for method reference in Java?

In Java 8, the double colon (::) operator is called method references.


1 Answers

Object.equals() accepts a single parameter. It is right. But here your introduced a function that accepts both the object to compare (this) and the parameter expected for equals (the other object).
So you need a BiPredicate<Person,Person> to allow to pass both information.

I think that the origin of your confusion is the method reference :

checkHere(Person::equals); 

Convert it into a lambda, it should do things clearer : (o1, o2) -> o1.equals(o2)

You indeed need to pass two arguments to the function to allow it substitute o1 and o2 and you do that :

return pc.test(p1, p2);
like image 87
davidxxx Avatar answered Sep 21 '22 07:09

davidxxx