使用聚合操作将对象集合复制到另一个集合而不重复

Copying a collection of objects to another collection without duplicates using aggregate operations

我有 List 个名为 items 的项目,我正在使用以下方法将此列表复制到 Set

 List<Item> items = new ArrayList<>();

    items.add(new Item("Suremen Body Spray", 1900, 45));
    items.add(new Item("HP wireless mouse", 5500, 5));
    items.add(new Item("UWS USB memory stick", 1900, 8));
    items.add(new Item("MTN modem", 1900, 45));
    items.add(new Item("MTN modem", 1900, 45));

    Collection<Item> noDups = new LinkedHashSet<Item>(items); //Copy items to noDups

    //Print the new collection
    noDups.stream()
       .forEach(System.out::println);

当我 运行 代码时,所有项目都被复制到集合中,如输出所示。

另一个只使用字符串的测试工作正常:

List<String> names = new ArrayList<>();

    names.add("Eugene Ciurana");
    names.add("Solid Snake");
    names.add("Optimus Prime");
    names.add("Cristiano Ronaldo");
    names.add("Cristiano Ronaldo");


    Collection<String> itemCollection = new HashSet<String>(names);
     itemCollection.stream()
           .forEach(System.out::println);

有什么方法可以将列表复制到集合中而不重复?是否有针对此的任何聚合操作,或者我是否必须编写自定义方法?

您需要在 Item class 中实现 equals and the hashCode 方法。

只是想我添加一个答案来展示我最终是如何做到的(当然使用 Adam 的建议)

我将 equalshashCode 方法的实现添加到我的项目 class:

@Override
public boolean equals(Object obj) {
    if(!(obj instanceof Item)) {
        return false;
    }
    if(obj == this) {
        return true;
    }

    Item other = (Item)obj;
    if(this.getName().equals(other.getName())
           && this.getPrice() == other.getPrice() 
           && this.getCountryOfProduction().equals(other.countryOfProduction)) {
        return true;
    } else {
        return false;
    }

}

public int hashCode() {
    int hash = 3;

    hash = 7 * hash + this.getName().hashCode();
    hash = 7 * hash + this.getCountryOfProduction().hashCode();
    hash = 7 * hash + Double.valueOf(this.getPrice()).hashCode();
    return hash;

}