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

时间:2011-09-20 07:07:35

标签: java list object arraylist contains

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

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

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;
    }
}

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

编辑(2016年10月):

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

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

6 个答案:

答案 0 :(得分:48)

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

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

答案 1 :(得分:8)

我建议您覆盖equals中的SearchableDto,例如:{/ p>

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

在这种情况下contains可能有效,如果它具有相同的id;

答案 2 :(得分:2)

嗯,我认为你的方法有点过于复杂。 你说:

  

我有一个从数据库收到的DTO列表,他们有一个ID。

然后,您可能应该使用DTO类来保存这些项目。如果是这样,将id getter和setter放在该类中:

public class DTO implements HasId{
    void setId(Long id);
    Long getId();
}

这足以迭代通过和ArrayList并搜索所需的id。 扩展ArrayList类只是为了添加“compare-id”feautre似乎过于复杂了。 @Nikita Beloglazov就是一个很好的例子。您可以进一步概括它:

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

答案 3 :(得分:1)

这是我在DFS GetUnvisitedNeighbour函数中使用的。

    public static int GetUnvisitedNeighbour(int v)
{
    Vertex vertex = VertexList.stream().filter(c -> c.Data == v).findFirst().get();
    int position = VertexList.indexOf(vertex);
    ...
}

我曾经在C#工作。 C#中的Lambda表达式比Java中更容易使用。

您可以使用filter函数添加元素属性的条件。

然后根据您的逻辑使用findFirst().get()findAny.get()

答案 4 :(得分:0)

你的要求对我来说并不清楚。当您说“确保我的列表包含具有指定ID的对象”时,您希望:

  1. 检测ID是否存在并采取相应措施
  2. 始终在结果中包含带有所需ID的DTO
  3. 大多数回答都假设你的意思是1,但是在考虑它的时候,你可以根据问题的措辞来表达意思。您可以通过更改查询来包含所需的结果:

    SELECT * FROM employee WHERE firstname = 'John' OR id = 42;
    

答案 5 :(得分:0)

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