找出对象列表是否包含具有指定字段值的内容?

2022-09-01 11:35:01

我有一个从数据库收到的DTO列表,他们有一个ID。我想确保我的列表包含具有指定 ID 的对象。显然,在这种情况下,创建一个具有预期字段的对象将无济于事,因为 contains() 调用 Object.equals(),并且它们不会相等。

我得到了一个这样的解决方案:创建一个接口,在我所有的DTO中实现它,并使用具有方法的新类继承ArrayList。HasIdcontains(Long id)

public interface HasId {
    void setId(Long id);
    Long getId();
}

public class SearchableList<T extends HasId> extends ArrayList<T> {
    public boolean contains(Long id) {
        for (T o : this) {
            if (o.getId() == id)
                return true;
        }
        return false;
    }
}

但是在这种情况下,我无法将列表和数组列表类型转换为可搜索列表...我会忍受这一点,但想确保我没有发明轮子。

编辑(2016年10月):

当然,随着Java 8中lambdas的引入,做到这一点的方法很简单:

list.stream().anyMatch(dto -> dto.getId() == id);

答案 1

我建议创建像你写的那样的简单静态方法,没有任何额外的接口:

public static boolean containsId(List<DTO> list, long id) {
    for (DTO object : list) {
        if (object.getId() == id) {
            return true;
        }
    }
    return false;
}

答案 2

我建议你只是覆盖你的它,就像这样:equalsSearchableDto

public boolean equals(Object o){
    if (o instanceof SearchableDto){
        SearchableDto temp = (SearchableDto)o;
        if (this.id.equals(temp.getId()))
            return true;
    }
    return false;
}

在这种情况下,如果它具有相同的,则可能工作containsid;