У меня есть список DTO, полученных от БД, и у них есть идентификатор. Я хочу убедиться, что мой список содержит объект с указанным идентификатором. Очевидно, что создание объекта с ожидаемыми полями в этом случае не поможет, так как содержит () вызовы для 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 ...
Я бы с этим жил, но хотел убедиться, что я не изобретаю велосипед.
РЕДАКТИРОВАТЬ (октябрь '16):
Конечно, с введением лямбды в Java 8, способ сделать это очень просто:
list.stream().anyMatch(dto -> dto.getId() == id);