[英]Java 8 Streams : Converting a list of objects to a set of objects
我正在尝试将对象列表转换为一组对象,以确保集合中不存在重复项。 我正在尝试使用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());
但这对我不起作用。 任何建议将被高度推荐!
目前尚不清楚为什么要创建新的Product
实例以存储在Set
。 您可以简单地创建一个Stream
并立即收集到Set
:
Set<Product> productPriceList = productsList.stream().collect(Collectors.toSet());
但是,必须重写equals()
和hashCode()
,以使Stream
管道创建的Set
正确消除重复项(因为toSet()
的当前实现返回一个HashSet
,这需要重写这些方法)。
当然,不使用Stream
也可以获得相同的结果:
Set<Product> productPriceList = new HashSet<>(productPriceList);
正如@Khelwood指出的那样,您需要提及平等规则。 JVM如何知道何时将两个产品视为相等? 该产品不是原始数据类型,因此JVM仅将其视为对象。 了解有关覆盖等于和哈希码及其用法和含义的信息。 就像一个建议一样,花一些时间阅读它而不是跳入解决方案将非常有用。
编辑:我看到许多类似的答案已经发布。 在写我的建议时没有看到它,但是看起来您知道为什么它失败了。 祝好运 !!
您的代码几乎可以编译了,您只是错过了p.getId
等的括号:
Set<Product> productPriceList = productsList.stream()
.map(p -> new Product(p.getId(), p.getName(), p.getPrice()))
.collect(Collectors.toSet());
但是,如果您希望产品集正常工作,则您的Product
必须覆盖equals
和hashCode
。 您可以查看此问题的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.