Google Guava isNullOrEmpty para colecciones

102

Veo que Guava tiene el método de utilidad isNullOrEmpty para Strings

Strings.isNullOrEmpty(str)

¿Tenemos algo similar para las listas? Algo como

Lists.isNullOrEmpty(list)

que debería ser equivalente a

list == null || list.isEmpty()

Además, ¿tenemos algo similar para las matrices? Algo como

Arrays.isNullOrEmpty(arr)

que debería ser equivalente a

arr == null || arr.length == 0
Ramesh
fuente

Respuestas:

141

No, este método no existe en Guayaba y de hecho está en nuestro "cementerio de ideas".

No creemos que "es nulo o vacío" sea una pregunta que realmente quieras hacerte sobre una colección.

Si una colección puede ser nula, y la nula debe tratarse de la misma forma que vacía, elimine toda esa ambigüedad desde el principio, así:

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

o así (si lo prefiere):

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

Después de eso, puedes usarlo .isEmpty()como de costumbre. Haga esto inmediatamente después de llamar a la API traviesa y habrá dejado atrás la rareza, en lugar de dejar que continúe indefinidamente.

Y si el "nulo que realmente significa colección vacía" no se le devuelve, sino que se le pasa, su trabajo es fácil: simplemente deje que NullPointerExceptionse lance un y haga que la persona que llama se configure.

Kevin Bourrillion
fuente
7
¿Qué sucede si algún marco lo establece en el campo en nulo y no puede controlarlo (marco de primavera cuando se vincula a la lista) aunque establece y usa explícitamente la lista vacía en el objeto?
OMax
15
Mi respuesta es la misma: intente eliminar la ambigüedad normalizando nulla una colección vacía tan pronto como pueda. Si simplemente no puede, entonces está bien, podría ser uno del <1% de usuarios que realmente quieren escribir su propio ayudante trivial isNullOrEmpty (Collection).
Kevin Bourrillion
8
(¡O omita el ayudante y simplemente escriba if (collection == null || collection.isEmpty())en los casos en que lo necesite! ¿Es tan malo?)
Kevin Bourrillion
13
Esta es una respuesta obstinada que en realidad no aborda la pregunta en absoluto. También va en contra de los principios de programación defensiva.
Neovibrant
11
@Neovibrant dado que la pregunta es sobre las capacidades de la biblioteca de Guava, y la respuesta es de uno de los desarrolladores principales de Guava, la respuesta está un poco implícita: "No, Guava no tiene eso". Sin embargo, la respuesta puede mejorarse comenzando con esa declaración :)
Grundlefleck
37

Una cosa que tenderá a encontrar en toda Guayaba es que tienden a ser muy antagónicos hacia nulls. Los autores quieren disuadirlo de que use nulltanto como probablemente lo haga, y proporcionar métodos de utilidad para facilitar su uso nullsería contraproducente para este fin.

Si desea utilizar el paradigma de Guava, considere si la fuente de esta colección (o matriz) realmente debería regresar opcionalmente null. Si no es así, considere marcarlo @NonNully devolver colecciones vacías en lugar de null. O como un parámetro para una función que espera nulllistas sin valor, considere usar Preconditions.checkNotNull, que genera una excepción si se nullpasa (inesperadamente).

Si nullrealmente es legítimo, list == null || list.isEmpty()no es tan difícil.

Rayo
fuente
9
es inconsistente. El mismo argumento podría hacerse para cuerdas, sin embargo, no es un Strings.isNullOrEmpty ()
Don Cheadle
29

Hay un CollectionUtils.isEmpty () en commons-collections.

Steven Schlansker
fuente
1
Desafortunadamente, parece haber sido eliminado en versiones más recientes. Consulte org.apache.commons.collections15.CollectionUtils.
spaaarky21
1
Mirando el Javadoc de apache.commons.collection, los métodos isEmpty () e isNotEmpty () todavía existen en la última versión. collections15.CollectionUtils parece un proyecto independiente que intenta proporcionar soporte genérico.
proko
1
CollectionUtils.isEmpty () es útil cuando se trabaja con aplicaciones heredadas, cuando no se puede cambiar el código inicial.
Jerome Dalbert
1
lo sabemos, pero uno preguntaba por la guayaba, no por los comunes de apache.
A Kra
9

Spring Framework tiene una clase de utilidad especializada llamada CollectionUtils. Y el método que busca es: org.springframework.util.CollectionUtils.isEmpty. Devuelve verdadero para colecciones nulas y vacías.

Y para las matrices hay un org.springframework.util.ObjectUtils.isEmptymétodo que se comporta de la misma manera.

Lukasz
fuente
5
Aunque probablemente sea seguro usarlo, esta clase está marcada con el comentario "Principalmente para uso interno dentro del marco". Esto significa que su interfaz puede cambiar en una actualización de Spring y tendrá que hacer un trabajo adicional para que vuelva a funcionar.
Mike Minicki
2

Apache CollectionUtils 4 tiene un método CollectionUtils.emptyIfNull () que devuelve una lista vacía si la colección es nula. Esto es muy útil en un bucle foreach, por lo que no necesita hacer una verificación nula antes de iterar

Jeffrey
fuente
1

Mi solución es: MoreObjects.firstNonNull (lista, Colecciones. EmptyList ())

Estoy usando Guava MoreObjects con JDK Collections.

 @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);
}
}
Jeton
fuente
1
Esto es exactamente lo que se sugiere en la respuesta superior , excepto que no usa un ImmutableList.
dimo414
Creo que es negativo porque uno quería una solución simple y rápida como los métodos de apache commons en NotEmpty ...
Para Kra,
Centro de ayuda> Privilegios> Votar en contra ¿Cuándo debo votar en contra? Use sus votos negativos cada vez que encuentre una publicación atrozmente descuidada, sin esfuerzo, o una respuesta que sea clara y quizás peligrosamente incorrecta. Tienes un número limitado de votos por día, y responder a los votos negativos te cuesta un poquito de reputación además de eso; úselos sabiamente. stackoverflow.com/help/privileges/vote-down
jeton
¿Crees que mi respuesta es "una publicación extremadamente descuidada, sin esfuerzo, o una respuesta que es clara y tal vez peligrosamente incorrecta"? Si no es así, ¿por qué vota negativamente?
jeton
0

Mire las colecciones de Appache CollectionUtils.isEmpty () devuelve verdadero si la colección es nula o está vacía

Anastasiia Kuzina
fuente