Google Guava isNullOrEmpty pour les collections


102

Je vois que Guava a la méthode utilitaire isNullOrEmpty pour les chaînes

Strings.isNullOrEmpty(str)

Avons-nous quelque chose de similaire pour les listes? Quelque chose comme

Lists.isNullOrEmpty(list)

qui devrait être équivalent à

list == null || list.isEmpty()

Aussi, avons-nous quelque chose de similaire pour les tableaux? Quelque chose comme

Arrays.isNullOrEmpty(arr)

qui devrait être équivalent à

arr == null || arr.length == 0

Réponses:


141

Non, cette méthode n'existe pas à Guava et se trouve en fait dans notre «cimetière d'idées».

Nous ne pensons pas que "est nul ou vide" soit une question que vous voudriez vraiment poser à propos d'une collection.

Si une collection peut être nulle et que null doit être traitée de la même manière que vide, éliminez toute cette ambiguïté à l'avance, comme ceci:

Set<Foo> foos = NaughtyClass.getFoos();
if (foos == null) {
  foos = ImmutableSet.of();
}

ou comme ça (si vous préférez):

Set<Foo> foos = MoreObjects.firstNonNull(
    NaughtyClass.getFoos(), ImmutableSet.<Foo>of());

Après cela, vous pouvez simplement utiliser .isEmpty()comme d'habitude. Faites-le immédiatement après avoir appelé l'API coquine et vous avez mis l'étrangeté derrière vous, au lieu de la laisser continuer indéfiniment.

Et si le "null qui signifie vraiment une collection vide" ne vous est pas retourné, mais vous est passé, votre travail est facile: laissez simplement un NullPointerExceptionêtre jeté, et faites en sorte que l'appelant se forme.


7
Que faire si un framework définit son champ sur null et que vous ne pouvez pas le contrôler (framework Spring lors de la liaison à la liste) bien que vous définissiez et utilisiez explicitement une liste vide dans l'objet.
OMax

15
Ma réponse est la même: essayez de lever l'ambiguïté en normalisant nullà une collection vide dès que vous le pouvez. Si vous ne pouvez tout simplement pas, alors d'accord, vous pourriez être l'un des <1% des utilisateurs qui veulent vraiment écrire leur propre assistant trivial isNullOrEmpty (Collection).
Kevin Bourrillion

8
(ou sautez l'aide et écrivez simplement if (collection == null || collection.isEmpty())dans les cas où vous en avez besoin! Est-ce si grave?)
Kevin Bourrillion

13
C'est une réponse avisée qui ne répond pas du tout à la question. Cela va également à l'encontre des principes de programmation défensive.
Neovibrant

11
@Neovibrant puisque la question porte sur les capacités de la bibliothèque Guava, et que la réponse est d'un des principaux développeurs de Guava, la réponse est un peu implicite: "Non, Guava n'a pas ça". La réponse peut être améliorée en commençant par cette déclaration :)
Grundlefleck

37

Une chose que vous aurez tendance à trouver dans Guava est qu'ils ont tendance à être très antagonistes envers les nulls. Les auteurs veulent vous décourager d'en utiliser nullautant que vous le faites probablement, et fournir des méthodes utilitaires pour le rendre plus facile à utiliser nullserait contre-productif à cette fin.

Si vous souhaitez utiliser le paradigme de Guava, demandez-vous si la source de cette collection (ou tableau) doit vraiment revenir en option null. Sinon, pensez à le marquer @NonNullet renvoyez des collections vides à la place de null. Ou en tant que paramètre d'une fonction qui attend des nulllistes sans valeur, envisagez d'utiliser Preconditions.checkNotNull, qui lève une exception si a nullest (de manière inattendue) passé.

Si c'est nullvraiment légitime, ce list == null || list.isEmpty()n'est pas si difficile.


9
c'est incohérent. Le même argument pourrait être fait pour Strings, mais il existe un Strings.isNullOrEmpty ()
Don Cheadle

29

Il y a un CollectionUtils.isEmpty () dans les collections communes.


1
Malheureusement, il semble avoir été supprimé dans les versions plus récentes. Voir org.apache.commons.collections15.CollectionUtils.
spaaarky21

1
En regardant le Javadoc de apache.commons.collection, les méthodes isEmpty () et isNotEmpty () existent toujours dans la dernière version. collections15.CollectionUtils semble être un projet indépendant essayant de fournir un support générique.
proko

1
CollectionUtils.isEmpty () est utile lorsque vous travaillez avec des applications héritées, lorsque vous ne pouvez pas modifier le code initial.
Jerome Dalbert

1
nous le savons, mais on posait des questions sur la goyave et non sur les communs apache.
To Kra

9

Spring Framework a une classe util spécialisée appelée CollectionUtils. Et la méthode que vous recherchez est: org.springframework.util.CollectionUtils.isEmpty. Il renvoie true pour les collections nulles et vides.

Et pour les tableaux, il existe une org.springframework.util.ObjectUtils.isEmptyméthode qui se comporte à peu près de la même manière.


5
Bien qu'il soit probablement sûr de l'utiliser, cette classe est marquée d'un commentaire «Principalement pour un usage interne dans le cadre». Cela signifie que son interface peut changer lors d'une mise à niveau Spring et que vous devrez effectuer un travail supplémentaire pour la faire fonctionner à nouveau.
Mike Minicki

2

Apache CollectionUtils 4 a une méthode CollectionUtils.emptyIfNull () qui renvoie une liste vide si la collection est nulle. Ceci est très utile dans une boucle foreach, vous n'avez donc pas besoin de faire une vérification nulle avant d'itérer


1

Ma solution est: MoreObjects.firstNonNull (liste, Collections. EmptyList ())

J'utilise Guava MoreObjects avec des collections JDK.

 @Test
public void listnull() {
List<String> list = null;

for (String str : MoreObjects.firstNonNull(list, Collections.<String> emptyList())) {
    System.out.println(str);
}

list = new ArrayList<String>();
list.add("http://stackoverflow.com/");

for (String str : MoreObjects.firstNonNull(list, Collections.<String> emptyList())) {
    System.out.println(str);
}
}

1
C'est exactement ce qui est suggéré dans la réponse du haut , sauf que vous n'utilisez pas de ImmutableList.
dimo414

Je pense négatif parce que l'on voulait une solution simple et rapide comme les méthodes apache commons inNotEmpty ...
To Kra

Centre d'aide> Privilèges> Vote contre Quand dois-je voter contre? Utilisez vos votes négatifs chaque fois que vous rencontrez un message extrêmement bâclé, sans effort, ou une réponse qui est clairement et peut-être dangereusement incorrecte. Vous avez un nombre limité de votes par jour, et les votes négatifs vous coûtent un tout petit peu de réputation en plus de cela; utilisez-les à bon escient. stackoverflow.com/help/privileges/vote-down
jeton

Pensez-vous que ma réponse est "un message extrêmement négligé, sans effort, ou une réponse clairement et peut-être dangereusement incorrecte"? Sinon, pourquoi votez-vous contre?
jeton

0

Regardez les collections Appache CollectionUtils.isEmpty () renvoie true si la collection est nulle ou vide

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.