Java 8 Streams: преобразование списка объектов в набор объектов - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь преобразовать список объектов в набор объектов, чтобы убедиться, что в коллекции нет дубликатов.Я пытаюсь это сделать с помощью Streams.

У меня есть класс Product, как показано ниже:

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()); 

Но это не работает для меня.Любые предложения будут высоко оценены!

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

Непонятно, почему вы создаете новые Product экземпляры для хранения в Set.Вы можете просто создать Stream и сразу собрать в Set:

 Set<Product> productPriceList = productsList.stream().collect(Collectors.toSet()); 

Однако вы должны переопределить equals() и hashCode() для Set, созданного Stream конвейер для правильного устранения дубликатов (поскольку текущая реализация toSet() возвращает HashSet, что требует переопределения этих методов).

Конечно, тот же результат может быть получен без Stream s:

Set<Product> productPriceList = new HashSet<>(productPriceList);
0 голосов
/ 30 мая 2018

Как сказал @Khelwood, вам нужно упомянуть правило равенства.Как JVM узнает, когда считать два продукта равными?Продукт не является примитивным типом данных, поэтому JVM рассматривает его только как объект.Прочитайте о переопределении equals и hashcode, его использовании и последствиях.Так же, как совет, будет полезно потратить некоторое время на чтение об этом, а не искать решения.

Редактировать: я вижу много похожих ответов уже опубликовано.Не видел этого при написании моих предложений, но похоже, что вы поняли, почему это не удается.удачи !!

0 голосов
/ 30 мая 2018

Ваш код будет практически скомпилирован, вы только что пропустили скобки p.getId и т. Д.:

Set<Product> productPriceList = productsList.stream()
    .map(p -> new Product(p.getId(), p.getName(), p.getPrice()))
    .collect(Collectors.toSet());

Однако ваш Product должен переопределить equals и hashCode, если вы хотите установитьработать правильно.Вы можете увидеть этот вопрос почему.

...