假设我有员工类,具有正确覆盖的等于和哈希码方法。
public class Employee {
private int eno;
private String firstName;
private String lastName;
@Override
public int hashCode() {
System.out.println("hashcode called");
final int prime = 31;
int result = 1;
result = prime * result + eno;
result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
result = prime * result + ((lastName == null) ? 0 : lastName.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
System.out.println("equals called");
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Employee other = (Employee) obj;
if (eno != other.eno)
return false;
if (firstName == null) {
if (other.firstName != null)
return false;
} else if (!firstName.equals(other.firstName))
return false;
if (lastName == null) {
if (other.lastName != null)
return false;
} else if (!lastName.equals(other.lastName))
return false;
return true;
}
}
测试类如下
class Test {
public static void main(String[] args) {
Employee e1 = new Employee(1, "Karan", "Mehara");
Employee e2 = new Employee(2, "Rajesh", "Shukla");
Set<Employee> emps= new HashSet<>();
emps.add(e1);
emps.add(e2);
System.out.println(emps);
// No such requirement just for testing purpose modifying
e2.setEno(1);
e2.setFirstName("Karan");
e2.setLastName("Mehara");
System.out.println(emps);
emps.stream().distinct().forEach(System.out::println);
}
员工 [eno=1, 名字=Karan, lastName=Mehara]
员工 [eno=1, 名字=Karan, lastName=Mehara]
为什么 distinct() 方法返回重复的元素??
根据雇员类的 equals() 和 hashcode() 方法,这两个对象是相同的。
我观察到,当我调用 distinct() method equals() 和 hashcode() 方法时,它不会获得对 Set 实现流的调用,但它会获得对 List 实现流的调用。
根据JavaDoc的说法,distinct()返回由该流的不同元素(根据Object.equals(Object))组成的流。
桃花长相依
相关分类