繁体   English   中英

Java 8 Streams:将对象列表转换为一组对象

[英]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必须覆盖equalshashCode 您可以查看此问题的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM