我正在尝试使用Contains方法按其名称在List集合中找到一个对象,但是以某种方式,它不起作用。我应该如何使用它?
这就是我尝试使用的方式
CandyDao.getAllCandys().contains("Caramel")
但是找不到我需要的对象。
CandyDao.java
public class CandyDao {
private List<Candy> candys = Arrays.asList(new Candy("Caramel", 3, false),
new Candy("Marmelade", 2, true));
public List<Candy> getAllCandys(){
return candys;
}
}
Candy.java
public class Candy {
private String name;
private float price;
private boolean InStock;
public Candy() {
}
public Candy(String name, float price, boolean InStock) {
setName(name);
setPrice(price);
setInStock(InStock);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public boolean getInStock() {
return InStock;
}
public void setInStock(boolean InStock) {
this.InStock = InStock;
}
}
答案 0 :(得分:3)
由于列表包含Candy
个对象,因此contains()
方法需要一个Candy
对象进行比较,因此您不能使用contains("Caramel")
。
要检查列表中是否包含Candy
为name
的{{1}}对象,可以使用Java 8+ Streams进行搜索:
"Caramel"
等效的非流版本为:
CandyDao.getAllCandys().stream().Map(Candy::getName).anyMatch("Caramel"::equals);
答案 1 :(得分:2)
覆盖equals
和hashcode
方法,如下所示:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Candy candy = (Candy) o;
return Objects.equals(name, candy.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
现在,由于equals函数仅检查Candy
对象的名称是否相等,因此应该可以进行以下操作:
CandyDao.getAllCandys().contains(new Candy("Caramel", 0, true)) . //2nd & 3rd arg of Candy constructor are inessential/dummy
答案 2 :(得分:0)
您应覆盖Object#equals
中的Candy
方法,如下所示:
@Override
public boolean equals(Object o) {
if (!(o instanceof Candy)) {
return false;
}
Candy that = (Candy) o;
return Objects.equals(that.getName(), this.getName());
}
覆盖后,如果名称匹配,List#contains
应返回true
。
答案 3 :(得分:0)
getAllCandys()
方法返回Candy
个对象的列表。您应该在列表中查找每个元素的name
属性。因此c
是candys
列表的元素。使用c.getName().contains("Caramel")
查找"Caramel"
for(Candy c : candys) {
System.out.println(c.getName() + " contains? " + c.getName().contains("Caramel"));
}