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 wheel.
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);
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…