Java

Equals неполучается сравнить обьекты

Подскажите пожадуйста, почему не получается сравнить обьекты по equals в методе remove
  

@Data

public class Cart {
private int totalPrice;
private List items;

public Cart(){
this.items = new ArrayList();
}

public List getItems() {
return Collections.unmodifiableList(items);
}

}

public void remove(Long productId){
items.removeIf(item -> item.getProductId().equals(productId));//TODO equals
recalculate();
}

}
Метод remove() в вашем коде пытается удалить элемент из списка объектов CartItem на основе значения свойства ProductID. Однако метод removeIf(), который используется для удаления элемента, принимает объект-предикат в качестве аргумента. Предикат - это функциональный интерфейс, который определяет метод тестирования объекта и возвращает логическое значение, указывающее, удовлетворяет ли объект определенному условию.

В вашем коде методу removeIf() передается лямбда-выражение, которое проверяет, равно ли свойство ProductID объекта CartItem заданному значению. Лямбда-выражение использует метод equals() для сравнения значений ProductID.

Однако метод equals() не определен для типа Long, который является типом свойства ProductID. Чтобы сравнить объекты типа Long, вам нужно будет использовать метод equals(), определенный в классе Object, который является суперклассом всех классов в Java. Вы можете сделать это, вызвав метод equals() в классе Object и передав ему значение ProductID в качестве аргумента следующим образом:
 items.removeIf( 
Compromissu_Net
Compromissu_Net
247
Лучший ответ
Антон Россеев Спасибо БОЛЬШОЕ за очень информативный ответ!
Подскажите тогда, как получается сравнение этом коде...
 @Data 
public class Cart {
private List items;
private int totalPrice;

public Cart() {
this.items = new ArrayList();
}



public void remove(Long productId) {
items.removeIf(o -> o.getProductId().equals(productId));
recalculate();
}



private void recalculate() {
totalPrice = 0;
for (OrderItemDto o : items) {
totalPrice += o.getPrice();
}
}


}
Антон Россеев я ведь тоже удаляю обьект с помощью items.removeIf()
С Long обычными все прекрасно работает. Вас обманывают другие ответчики.
Похоже, что у вас в equals опечатка. Проверьте русские буквы в названии.
А также прикладывайте полный код!
Вы ничего не даете, чтобы понять ошибку.
Она может быть в поле productId в CartItem. Не Long типа.
В CartItem есть метод equals, принимающий не Object, а что-то другое (не Long)
И др.
Алексей Шатов
Алексей Шатов
55 095
Антон Россеев Просто зачастую для понимания какой нибудь мелкой ошибки, нужно потратить оочень много времени. Сейчас его критически не хватает(
CartItem это отдельный класс. В классе Cart есть другие методы. Но на вход у них подаедся Product. Например.ю..
     public void add(Product product){ 
for (CartItem item :
items) {
if (product.getId().equals(item.getProductId())){
item.changeQuantity(1);
recalculate();
return;
}
}
items.add(new CartItem(product.getId(), product.getTitle(), 1, product.getPrice(), product.getPrice()));
}
В методе remove что то другое. Ибо после точки нету варианта сравнения через equals
видимо класс Long не имеет метода equals(), для примитивных классов используется == или ===, потому что они всегда передаются byValue, а не byRef
Зариф Шарипов
Зариф Шарипов
15 114

Похожие вопросы