Stream.distinct()未过滤的等对象

mke*_*ley 6 java equality java-stream

我有一个Element对象流,我需要根据相等性进行过滤.这似乎很容易,.distinct()但我得到了异常的结果.即使对象返回相同,它们也不会被过滤掉.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());
Run Code Online (Sandbox Code Playgroud)

输出:

Elements with same name: 2
Equals?: true
Distinct Elements: 8
Full Elements: 8
Run Code Online (Sandbox Code Playgroud)

小智 13

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

返回由此流的不同元素(根据Object.equals(Object))组成的流.

你重写equals()hashCode()该的Element类是否正确?

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--

  • 我们没有覆盖`hashCode()`.那就是问题所在.尽管文档声明它们使用`equals()`但它对于`distinct()`是不够的.有意思......谢谢! (12认同)