Java >> Tutoriel Java >  >> Java

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));

Balise Java