对 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
属性。所以 c
是 candys
list 的一个元素。使用 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;
}
}
我正在尝试使用 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
属性。所以 c
是 candys
list 的一个元素。使用 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;
}
}