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