我正在阅读一本关于 Java8 的书,其中对流进行了解释。提到产生不同元素的相等性由hashCode()
&equals()
方法的实现决定。因此,我编写了以下代码以通过示例来理解:
static class Order{
public Order(int id,Double value){
this.id = id;
this.value = value;
}
int id;
Double value;
@Override
public int hashCode() {
System.out.println("In Hashcode() - " + this.id +","+this.value);
return this.id;
}
@Override
public boolean equals(Object o){
System.out.println("In Equals()");
return this.id == ((Order)o).id;
}
}
public static void main(String[] args) {
Stream<Order> orderList = Stream.of(new Order(1,10.0),new Order(2,140.5),new Order(2,100.8));
Stream<Order> biggerOrders = orderList.filter(o->o.value > 75.0);
biggerOrders.distinct().forEach(o->System.out.println("OrderId:"+ o.id));
}
它产生了以下输出:
In Hashcode() - 2,140.5
In Hashcode() - 2,140.5
OrderId:2
In Hashcode() - 2,100.8
In Equals()
我很困惑为什么在将同一个 Order 对象(2,140.5)上的 hashCode 方法与另一个 Order 对象(2,100.8)进行比较之前调用了两次。
提前致谢。