У меня есть список 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;
}
}
Но в данном случае я не могу набрать List и ArrayList в SearchableList... Я бы с этим смирился, но хотел убедиться, что я не изобретаю велосипед.
EDIT (Oct '16):
Конечно, с введением ягнят на Java 8 путь к этому прост:
list.stream().anyMatch(dto -> dto.getId() == id);