在 ArrayList 中查找对象

Find object in ArrayList

我想在 ArrayList 中找到一个 LegalEntity 对象。该对象可能是不同的实例。我只对它们是否代表相同的值感兴趣,即它们是否具有相同的主键。所有 LegalEntity 个实例都是由 EJB 从数据库值创建的:

List<LegalEntity> allLegalEntities = myEJB.getLegalEntityfindAll());
LegalEntity currentLegalEntity = myEJB.getLegalEntityfindById(123L);

我第一个幼稚的想法从来没有找到匹配项:

if (allLegalEntities.contains(currentLegalEntity)) {
}

然后我想也许我需要创建自己的 equals() 方法:

public boolean equals(LegalEntity other) {
    return legalEntityId.equals(other.legalEntityId);
}

但是这个方法甚至没有被调用。有没有办法在不涉及循环的情况下在列表中查找对象?

我正在学习Java所以这很容易是我这边的一些愚蠢的误解。

如果您使用的是 Java 8,则可以使用流:

List<LegalEntity> allLegalEntities = myEJB.getLegalEntityfindAll());
LegalEntity currentLegalEntity = allLegalEntities.stream().filter(entity -> entity.getId() == 123L).findFirst();

你的方法是正确的,但你需要覆盖接受Object:

的方法equals
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    LegalEntity other = (LegalEntity) obj;
    // check if equals based one some properties
}

但是您还需要覆盖 hashCode:

@Override
public int hashCode() {
    // return a unique int
}

所以这可能不是最简单的解决方案。

另一种方法是使用 filter:

LegalEntity myLegalEntity = myEJB.getLegalEntityfindAll().stream()
                              .filter(legalEntity -> legalEntity.getProperty().equals("someting"))
                              .findAny()
                              .orElse(null);

更多信息here