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

Ser*_*gey 28 java contains list arraylist object

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

我想出了一个类似的解决方案:创建一个接口HasId,在我的所有DTO中实现它,并继承带有方法的新类的ArrayList contains(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;
    }
}
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,我不能将List和ArrayList强制转换为SearchableList ......我会接受它,但我想确保我不是在发明自行车.

编辑(2016年10月):

当然,随着Java 8中lambda的引入,这样做的方法很简单:

list.stream().anyMatch(dto -> dto.getId() == id);
Run Code Online (Sandbox Code Playgroud)

Nik*_*zov 49

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

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


med*_*pal 8

我建议你只是覆盖equals你的SearchableDto内容就像:

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

在这种情况下,contains如果它有相同的话应该可以工作id;