Comment vérifier si une liste contient un objet avec un champ d'une certaine valeur en Java
Comment vérifier si une collection en Java contient un objet avec un champ d'une certaine valeur ?
Supposons que nous travaillions avec une collection appelée list
.
List<CustomObject> list = new ArrayList<>();
Disons notre CustomObject
la classe contient un name
attribut.
public class CustomObject {
private String name;
public CustomObject(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Nous voulons vérifier si list
contient un objet CustomObject
avec le name
attribut de Max
.
CustomObject obj = new CustomObject();
obj.setName("Max");
Il ne semble pas que nous puissions simplement utiliser list.contains(obj)
, alors que pouvons-nous faire ?
Remplacer le equals()
méthode
Si possible, l'approche préférable est de remplacer le equals()
méthode dans notre CustomObject
classe.
Remplacer equals()
, qui est utilisé dans contains()
, comparera les noms de chaque CustomObject
instance pour déterminer l'égalité.
public class CustomObject {
// ...constructor, getters, setters...
@Override
public boolean equals(Object obj) {
if (obj == this)
return true; // Same object in memory
if (!(obj instanceof CustomObject))
return false; // Not even the same class
final CustomObject other = (CustomObject) obj;
return name.equals(other.getName());
}
@Override
public int hashCode() {
return name.hashCode();
}
// ...other class methods...
}
Nous devons remplacer hashCode()
ainsi que pour renvoyer des valeurs cohérentes (c'est-à-dire que si deux objets sont égaux, ils doivent avoir des codes de hachage égaux).
Nous pouvons alors utiliser contains()
pour vérifier si une collection contient un objet avec une valeur d'attribut spécifique.
list.contains(obj);
Si nous ne pouvons pas remplacer le equals()
et hashCode()
fonctions, nous pouvons vérifier la deuxième approche.
Vérifier à l'aide de l'API Stream (Java 8+)
Nous pouvons utiliser l'API Stream pour savoir si la liste contient un objet avec une valeur spécifique pour le name
attribut.
list.stream().anyMatch(o -> o.getName().equals(name));
Si nécessaire, nous pouvons filtrer les valeurs nulles dans le flux.
list.stream()
.filter(Objects::nonNull)
.anyMatch(o -> o.getName().equals(name));
Si nous voulons faire des comparaisons complètement nulles, nous pouvons utiliser Object.equals()
.
list.stream().anyMatch(o -> Object.equals(o.getName(), name));