对 List 集合中的对象使用 Contains

Using Contains for objects in List collection

我正在尝试使用 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;
  }
}

您应该覆盖 Candy 中的 Object#equals 方法,如下所示:

@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 应该 return true

重写 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 函数只检查 name 是否与 Candy 对象相等,因此以下应该有效:

CandyDao.getAllCandys().contains(new Candy("Caramel", 0, true)) .   //2nd & 3rd arg of Candy constructor are inessential/dummy

getAllCandys() 方法 returns Candy 对象列表。您应该查看列表中每个元素的 name属性。所以 ccandyslist 的一个元素。使用 c.getName().contains("Caramel") 寻找 "Caramel"

for(Candy c : candys) {
            System.out.println(c.getName() + " contains? " + c.getName().contains("Caramel"));
        }

由于列表包含Candy个对象,contains()方法需要一个Candy对象进行比较,所以不能使用contains("Caramel").

要检查列表是否包含 name"Caramel"Candy 对象,您可以使用 Java 8+ Streams 进行搜索:

CandyDao.getAllCandys().stream().Map(Candy::getName).anyMatch("Caramel"::equals);

等效的非流版本为:

boolean hasCaramel = false;
for (Candy candy : CandyDao.getAllCandys()) {
    if ("Caramel".equals(candy.getName())) {
        hasCaramel = true;
        break;
    }
}