2015-11-24 49 views
2

我有一個Element對象流,我需要根據相等性進行過濾。這似乎很容易與.distinct()但我得到異常的結果。即使對象返回相等,它們也不會被.distinct()過濾。未被Stream.distinct過濾的等效對象()

我錯過了什麼?下面證明 -

List<Element> elements = getStream().filter(e -> e.getName().equals("userId")).collect(Collectors.toList()); 

System.out.println("Elements with same name: " + elements.size()); 

if(elements.size() > 1) { 
    System.out.println("Equals?: " + elements.get(0).equals(elements.get(1))); 
} 

System.out.println("Distinct Elements: " + getStream().distinct().count()); 
System.out.println("Full Elements: " + getStream().count()); 

輸出:

Elements with same name: 2 
Equals?: true 
Distinct Elements: 8 
Full Elements: 8 
+0

貴'Element'類覆蓋'equals'? – k0ner

+0

是的。我正在使用Apache EqualsBuilder。它確實返回正確,如上所示。 (Object obj){ if(obj == null){ return false; } if(obj == this){ return true; (obj.getClass()!= getClass()){ }返回false; } Element other =(Element)obj; 返回新的EqualsBuilder()。append(getName(),other.getName())。isEquals(); } – mkeathley

+0

也 - 如果您運行此代碼,將會得到'IllegalStateException'。 'collect'方法是終端操作 – k0ner

回答

3

根據流API的distinct()方法(http://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#distinct--):

返回由不同元素的流(根據Object.equals(Object))。

你重寫Elementequals()hashCode()是否正確?

http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object- http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--

+2

我們不是重寫'hashCode()'。這是問題所在。儘管文檔聲明他們使用'equals()',但對distinct()來說是不夠的。有趣......謝謝! – mkeathley