40 votes

Aide pour supprimer la référence nulle dans la liste Java?

Supposons que la liste suivante

 List<String> list = new ArrayList<String>();

list.add("s1");
list.add("s2");
list.add(null);
list.add("s3");
list.add(null);
list.add("s4");
 

J'ai besoin d'une classe Helper qui supprime les références nulles. Quelque chose comme

SomeHelper.removeNullReference (list);

Maintenant, la liste ne contient que "s1", "s2", "s4", "s4". Références non nulles.

Que dois-je utiliser pour répondre à cette exigence?

Cordialement,

111voto

Michael Borgwardt Points 181658
list.removeAll(Collections.singleton(null));

3voto

Dónal Points 61837

Si vous pouvez contrôler l'instanciation de List vous pouvez empêcher l'ajout des valeurs nulles en écrivant une implémentation personnalisée de List telle que:

 public class NoNullsList<E> extends ArrayList<E> {

  public void add(int index, E element) {
    if (element != null) {
      super.add(index, element);
    }
  }

  public boolean add(E e) {
    return e == null ? false : super.add(e);
  }
}
 

Autant que je sache, vous n'avez pas besoin de surcharger addAll parce que le ArrayList appelle son exécution add .

 List<String> list = new NoNullsList<String>();

list.add("s1");
list.add("s2");
list.add(null);
list.add("s3");
list.add(null);
list.add("s4");
 

3voto

debaser Points 61

Un inconvénient de Don de l'approche est qu'elle s'étend de l' ArrayList. Qui peut être assez bon pour l'instant, mais ce qui se passe lorsque vous souhaitez utiliser un autre List mise en œuvre? Vous pourriez faire un NoNullsLinkedList et NoNullsCopyOnWriteArrayList,, etc, mais ensuite vous vous retrouvez avec un tas de peu de classes qui diffèrent seulement dans leur extends de la clause. Il peut être préférable de créer un List wrapper qui n'accepte pas les valeurs null. Par exemple:

public class NonNullList<E> extends AbstractList<E> {
  private final List<E> delegate;

  public NonNullList(List<E> delegate) {
    this.delegate = delegate;
  }

  @Override
  public E get(int index) {
    return delegate.get( index );
  }

  @Override
  public int size() {
    return delegate.size();
  }

  @Override
  public E set(int index, E element) {
    return delegate.set( index, element );
  }

  @Override
  public void add(int index, E element) {
    if( element != null ) {
      delegate.add( index, element );
    }
  }

  @Override
  public E remove(int index) {
    return delegate.remove( index );
  }
}

C'est plus de code, mais maintenant, vous avez la possibilité de choisir un List mise en œuvre lorsque vous créez l'objet.

Un problème possible est que vous pouvez toujours insérer nulls dans le sous-jacent List objet. Ne l'approche n'a pas la même limitation.

0voto

removeAll n'a pas fonctionné pour moi. Au lieu de cela, je crée une nouvelle liste:

 new ArrayList<E>(list);
 

Aussi simple que cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X