Java 8 distinct()不调用equals方法

Java 8 distinct()不调用equals方法,java,lambda,java-stream,Java,Lambda,Java Stream,在Java 8中,distinct()中间操作状态的文档 返回由此流的不同元素(根据>Object.equals(Object))组成的流。 对于有序流,不同元素的选择是稳定的(对于重复元素,元素首先出现) 但它没有被呼叫 我的Item类中的Equals方法 @Override public boolean equals(Object obj) { System.out.println(this.name+"<->"+((Item)obj).name); return

在Java 8中,distinct()中间操作状态的文档

返回由此流的不同元素(根据>Object.equals(Object))组成的流。 对于有序流,不同元素的选择是稳定的(对于重复元素,元素首先出现)

但它没有被呼叫

我的Item类中的Equals方法

@Override
public boolean equals(Object obj) {
    System.out.println(this.name+"<->"+((Item)obj).name);
    return this.name.equals(((Item)obj).name);
}

但是我意识到equals方法没有被调用

您是否也覆盖了HashCode方法

distinct
不可能重载。如果要提供用于比较的自定义逻辑,最好使用
distinctBy
API


除了
equals()
之外,您还需要重写
hashCode()
方法。
distinct()
方法可能在内部使用一个集合,这反过来需要正确实现
hashCode()
。更多。

不确定这是否回答了您的问题,只是因为您没有看到
equals()被调用并不是说流没有在内部调用它,如果你看到它的话,请考虑提供一个可能的。这样,志愿者就更有可能帮助你。你确定<代码>数据。GISTEMTELL()/XISTUTE(< /代码>编译)?AFAIK <代码> java。UTIL.List< /COD>没有方法<代码>区别()
。我同意@Thomas的说法,您似乎没有使用流。您是否也在类
中实现了
hashCode()
方法(与您实现的
equals
方法一致)?即使文档没有这样说,这对于
distinct()也是必要的
。我认为没有任何重载问题。distinct()的流api文档提到了distinct()使用Steam元素的equals方法。但应该调用它。并没有文档说明distinct只能在集合上工作。无论如何,若我使用的集合默认存储基于hashCode的唯一元素,为什么我甚至需要distinct()。但我仍然会尝试真正的问题是equals方法没有被调用。是的!你是正确的,equals方法只有在hashCode匹配时才被调用。不,它似乎只有在hashCode匹配时才调用equals。就像基于哈希的集合一样
public static List<Item> getItemList(){     
    itemData.add(new Item("Orange","Citrus Fruit","Orange",30,true,false));
    itemData.add(new Item("Apple Green","Universal Fruit","Green",60,false,true));
    itemData.add(new Item("Papaya","Wonderful Fruit","Yellow",120,false,true));
    itemData.add(new Item("Papaya","Wonderful Fruit","Green",100,false,true));
    .
    .
    .
    itemData.add(new Item("Strawberry","Citrus Fruit","Red",25,true,false));
    itemData.add(new Item("Sapota","Brown Fruit","Brown",32,false,true));

    return itemData;
}
Data.getItemList().stream().distinct().forEach(System.out::println)