试图理解Java8中的流的distinct()

时间:2016-01-02 03:40:11

标签: java java-8 stream-operators

我正在阅读一本关于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()

我很困惑为什么hashCode方法在同一个Order对象上(2,140.5) 在将其与另一个订单对象(2,100.8)进行比较之前调用两次。

提前致谢。

2 个答案:

答案 0 :(得分:3)

作为@Adi的回答,distinct()在内部使用HashMap调用hashCode()的{​​{1}}。

这是两个调用的相关代码

Order

java.util.stream.DistinctOps.makeRef()

以下是两个电话的堆栈跟踪。

enter image description here enter image description here

答案 1 :(得分:2)

首次调用hashCode来检查HashMap中是否已存在项(顺序)(distinct使用内部HashMap)。第二次调用它将项(顺序)放在hashmap中(如果不存在)。

提示:尝试调试hashCode方法。