我正在尝试将对象列表转换为一组对象,以确保集合中是否存在重复项。我正在尝试使用Streams。
我有一个产品类如下:
class Product{
int id;
String name;
float price;
public Product(int id, String name, float price) {
this.id = id;
this.name = name;
this.price = price;
}
public String getName()
{
return this.name;
}
public int getId()
{
return this.id;
}
public float getPrice()
{
return this.price;
}
public void setName(String name)
{
this.name = name;
}
public void setId(int id)
{
this.id = id;
}
public void getPrice(float price)
{
this.price = price;
}
}
我正在尝试像:
List<Product> productsList = new ArrayList<Product>();
//Adding Products
productsList.add(new Product(1,"HP Laptop",25000f));
productsList.add(new Product(2,"Dell Laptop",30000f));
productsList.add(new Product(3,"Lenevo Laptop",28000f));
productsList.add(new Product(4,"Sony Laptop",28000f));
productsList.add(new Product(5,"Apple Laptop",90000f));
productsList.add(new Product(5,"Apple Laptop",90000f));
我希望将结果存储为Set:
Set<Product> productPriceList=productsList.stream()
.map(p->new Product(p.getId,p.getName,p.getPrice))
.collect(Collectors.toSet());
但它不适合我。 任何建议都会受到高度关注!
答案 0 :(得分:3)
目前尚不清楚为什么要创建要存储在Product
中的新Set
个实例。您只需创建一个Stream
并立即收集到Set
:
Set<Product> productPriceList = productsList.stream().collect(Collectors.toSet());
但是,您必须覆盖equals()
和hashCode()
,以便Set
管道创建的Stream
能够正确消除重复项(因为{{1}的当前实现返回toSet()
,需要覆盖这些方法。
当然,没有HashSet
s:
Stream
答案 1 :(得分:3)
正如@Khelwood所指出的,你需要提到平等的规则。 JVM如何知道何时将两个产品视为相同?该产品不是原始数据类型,因此JVM仅将其视为对象。阅读有关重写equals和hashcode及其用法和含义的内容。作为一个建议,花一些时间阅读它而不是跳入解决方案将是非常有用的。
编辑:我看到很多类似的答案已经发布。在写我的建议时没有看到它,但看起来你知道为什么它失败了。祝你好运!!
答案 2 :(得分:2)
您的代码几乎可以编译,您只是错过了p.getId
等的括号:
Set<Product> productPriceList = productsList.stream()
.map(p -> new Product(p.getId(), p.getName(), p.getPrice()))
.collect(Collectors.toSet());
但是,如果您希望套装正常运行,则Product
必须覆盖equals
和hashCode
。您可以查看this question了解原因。