Sergey Sergey - 1 month ago 12
Java Question

Finding out if a list of Objects contains something with a specified field value?

I have a list of DTO received from a DB, and they have an ID. I want to ensure that my list contains an object with a specified ID. Apparently creating an object with expected fields in this case won't help because contains() calls for Object.equals(), and they won't be equal.

I came up to a solution like so: created an interface

HasId
, implemented it in all my DTOs, and inherited ArrayList with a new class that has
contains(Long id)
method.

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


But in this case I can't typecast List and ArrayList to SearchableList...
I'd live with that, but wanted to make sure that I'm not inventing the bicycle.

EDIT (Oct '16):

Of course, with the introduction of lambdas in Java 8 the way to do this is straightforward:

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

Answer

I propose to create simple static method like you wrote, without any additional interfaces:

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