J'ai une liste de DTO reçus d'une base de données et ils ont un ID. Je veux m'assurer que ma liste contient un objet avec un identifiant spécifié. Apparemment, la création d'un objet avec les champs attendus dans ce cas ne sera d'aucune utilité, car les appels contient () pour Object.equals (), et ils ne seront pas égaux.
Je suis arrivé à une solution comme celle-ci: créer une interface HasId
, la mettre en œuvre dans tous mes DTO et hériter de ArrayList avec une nouvelle classe dotée de la méthode 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;
}
}
Mais dans ce cas, je ne peux pas transtyper List et ArrayList à SearchableList ... Je veux vivre avec ça, mais je voulais m'assurer que je n'invente pas le vélo.
EDIT (oct '16):
Bien sûr, avec l'introduction de lambdas dans Java 8, la manière de procéder est simple:
list.stream().anyMatch(dto -> dto.getId() == id);
Je propose de créer une méthode statique simple, comme vous l'avez écrit, sans aucune interface supplémentaire:
public static boolean containsId(List<DTO> list, long id) {
for (DTO object : list) {
if (object.getId() == id) {
return true;
}
}
return false;
}
Je suggère que vous remplaciez simplement la equals
dans votre SearchableDto
ce serait quelque chose comme:
public boolean equals(Object o){
if (o instanceof SearchableDto){
SearchableDto temp = (SearchableDto)o;
if (this.id.equals(temp.getId()))
return true;
}
return false;
}
Dans ce cas, contains
devrait fonctionner probablement s'il a la même id
;
Eh bien, je pense que votre approche complique un peu le problème ... vous avez dit:
J'ai une liste de DTO reçus d'une base de données et ils ont un ID.
Ensuite, vous devriez probablement utiliser une classe DTO pour contenir ces éléments. Si c'est le cas, mettez id getter et setter à l'intérieur de cette classe:
public class DTO implements HasId{
void setId(Long id);
Long getId();
}
C’est suffisant pour parcourir et ArrayList et rechercher l’id désiré .. La classe extensible ArrayList uniquement pour ajouter le type "compare-id" semble trop compliquée pour moi. @ Nikita Beloglazov est un bon exemple. Vous pouvez le généraliser encore plus:
public boolean containsId(List<HasId> list, long id) {
for (HasId object : list) {
if (object.getId() == id) {
return true;
}
}
return false;
}
Votre exigence n'est pas claire pour moi. Lorsque vous dites "Assurez-vous que ma liste contient un objet avec un identifiant spécifié", voulez-vous:
La plupart des réponses ont supposé que vous vouliez dire 1, cependant, en y réfléchissant, vous pourriez tout aussi bien dire 2 étant donné le libellé de la question. Vous pouvez inclure le résultat requis en modifiant votre requête:
SELECT * FROM employee WHERE firstname = 'John' OR id = 42;
C'est ce que j'ai utilisé dans ma fonction DFS GetUnvisitedNeighbour.
public static int GetUnvisitedNeighbour(int v)
{
Vertex vertex = VertexList.stream().filter(c -> c.Data == v).findFirst().get();
int position = VertexList.indexOf(vertex);
...
}
Je travaillais en C #. Les expressions lambda en C # sont beaucoup plus faciles à utiliser qu’en Java.
Vous pouvez utiliser la fonction filter
pour ajouter une condition à la propriété de l'élément.
Puis utilisez findFirst().get()
ou findAny.get()
selon votre logique.
public boolean containsId(List<HasId> list, long id) {
boolean flag = false;
for (HasId object : list) {
if (object.getId() == id) {
flag = true;
}
}
return flag;
}