Estaba practicando mis habilidades de Java 8. Me encontré con un código extraño (para mí). Tengo mi clase de bean Person
con anulado equals
método. Luego trató de poner en práctica BiPredicate
con 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 test
mé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;
}
}
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 o1
y o2
y se hace eso:
return pc.test(p1, p2);