Java 8 Different()不调用equals方法

Rag*_*kla 1 java lambda java-stream

在Java 8中,docs用于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);
}
Run Code Online (Sandbox Code Playgroud)

在数据类中定义数据

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;
}
Run Code Online (Sandbox Code Playgroud)

使用流

Data.getItemList().stream().distinct().forEach(System.out::println)
Run Code Online (Sandbox Code Playgroud)

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

Var*_*yay 5

您是否也覆盖了 HashCode 方法?

不可能发生重载distinct。如果您想提供自定义逻辑进行比较,那么最好使用distinctByAPI。

区别于


Ben*_*oit 5

在旁边equals(),您还需要重写hashCode()method。该distinct()方法可能在内部使用一个set,这反过来又需要正确实现hashCode()。更多信息

  • 没有文档表明 unique 只能在集合上工作。无论如何,如果我使用默认情况下基于 hashCode 存储唯一元素的集合,为什么我还需要distinct()。但我仍然会尝试 (2认同)