Google Guava isNullOrEmpty para coleções

102

Vejo que Guava tem o método utilitário isNullOrEmpty para Strings

Strings.isNullOrEmpty(str)

Temos algo semelhante para listas? Algo como

Lists.isNullOrEmpty(list)

que deve ser equivalente a

list == null || list.isEmpty()

Além disso, temos algo semelhante para Arrays? Algo como

Arrays.isNullOrEmpty(arr)

que deve ser equivalente a

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

Respostas:

141

Não, este método não existe na Goiaba e está em nosso "cemitério de idéias".

Não acreditamos que "é nulo ou vazio" seja uma pergunta que você realmente queira fazer sobre uma coleção.

Se uma coleção pode ser nula e nula deve ser tratada da mesma forma que vazia, tire toda essa ambigüidade logo de cara, assim:

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

ou assim (se preferir):

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

Depois disso, você pode usar .isEmpty()normalmente. Faça isso imediatamente após chamar a API impertinente e você deixará a estranheza para trás, em vez de deixá-la continuar indefinidamente.

E se o "nulo que realmente significa coleção vazia" não está sendo devolvido para você, mas passado para você, seu trabalho é fácil: apenas deixe um NullPointerExceptionser lançado e faça o chamador formar.

Kevin Bourrillion
fonte
7
E se algum framework estiver definindo seu campo como null e você não puder controlá-lo (framework spring quando em vinculação a lista), embora você defina explicitamente e use lista vazia no objeto.
OMax
15
Minha resposta é a mesma: tente remover a ambigüidade normalizando nullpara uma coleção vazia o mais rápido possível. Se você simplesmente não puder, então tudo bem, você pode ser um dos <1% dos usuários que realmente querem escrever seu próprio auxiliar isNullOrEmpty (Collection) trivial.
Kevin Bourrillion
8
(ou pule o auxiliar e apenas escreva if (collection == null || collection.isEmpty())nos casos em que você precisar! Isso é tão ruim?)
Kevin Bourrillion
13
Esta é uma resposta opinativa que na verdade não aborda a questão. Também vai contra os princípios de programação defensiva.
Neovibrante
11
@Neovibrant, já que a pergunta é sobre os recursos da biblioteca Guava, e a resposta é de um dos principais desenvolvedores do Guava, a resposta está meio implícita: "Não, o Guava não tem isso". A resposta pode ser melhorada começando com essa afirmação :)
Grundlefleck
37

Uma coisa que você descobrirá em toda a Guava é que eles tendem a ser muito antagônicos em relação aos nulls. Os autores desejam desencorajá-lo de usar nulltanto quanto você provavelmente usa , e fornecer métodos utilitários para torná-lo mais fácil de usar nullseria contraproducente contra esse fim.

Se você quiser usar o paradigma do Guava, considere se a fonte desta coleção (ou array) realmente deve retornar opcionalmente null. Caso contrário, considere marcá-lo @NonNulle retornar coleções vazias em vez de null. Ou como um parâmetro para uma função que está esperando nulllistas sem valores, considere usar Preconditions.checkNotNull, que lança uma exceção se a nullfor (inesperadamente) passado.

Se nullrealmente é legítimo, list == null || list.isEmpty()não é tão difícil.

Raio
fonte
9
é inconsistente. O mesmo argumento poderia ser feito para Cordas, ainda não é um Strings.isNullOrEmpty ()
Don Cheadle
29

Há um CollectionUtils.isEmpty () nas coleções comuns.

Steven Schlansker
fonte
1
Infelizmente, parece ter sido removido em versões mais recentes. Consulte org.apache.commons.collections15.CollectionUtils.
spaaarky21
1
Olhando para o Javadoc de apache.commons.collection, os métodos isEmpty () e isNotEmpty () ainda existem na versão mais recente. coleções15.CollectionUtils parece um projeto independente que tenta fornecer suporte genérico.
proko
1
CollectionUtils.isEmpty () é útil ao trabalhar com aplicativos legados, quando você não pode alterar o código inicial.
Jerome Dalbert,
1
nós sabemos disso, mas alguém estava perguntando sobre goiaba, não sobre apache commons.
Para Kra
9

Spring Framework tem uma classe util especializada chamada CollectionUtils. E o método que você está procurando é: org.springframework.util.CollectionUtils.isEmpty. Ele retorna verdadeiro para coleções nulas e vazias.

E para matrizes, há um org.springframework.util.ObjectUtils.isEmptymétodo que se comporta da mesma forma.

Lukasz
fonte
5
Embora provavelmente seja seguro usá-lo, esta classe está marcada com o comentário "Principalmente para uso interno dentro da estrutura". Isso significa que sua interface pode mudar em uma atualização do Spring e você terá que fazer um trabalho adicional para fazê-la funcionar novamente.
Mike Minicki
2

Apache CollectionUtils 4 tem um método CollectionUtils.emptyIfNull () que retorna uma lista vazia se a coleção for nula. Isso é muito útil em um loop foreach, então você não precisa fazer uma verificação de nulo antes de iterar

Jeffrey
fonte
1

Minha solução é: MoreObjects.firstNonNull (list, Collections. EmptyList ())

Estou usando Guava MoreObjects com coleções 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);
}
}
Jeton
fonte
1
Isso é exatamente o que está sugerido na resposta principal , exceto que você não usa um ImmutableList.
dimo414
Eu acho negativo porque se queria uma solução simples e rápida como os métodos apache commons inNotEmpty ...
Para Kra
Central de Ajuda> Privilégios> Votar contra Quando devo votar contra? Use seus votos negativos sempre que encontrar uma postagem notoriamente descuidada e sem esforço, ou uma resposta que seja clara e talvez perigosamente incorreta. Você tem um número limitado de votos por dia e, além disso, os votos negativos custam um pouco de reputação; use-os com sabedoria. stackoverflow.com/help/privileges/vote-down
jeton
Você acha que minha resposta é "postagem notoriamente descuidada, sem esforço despendido ou uma resposta que é clara e talvez perigosamente incorreta"? Se não, por que você está votando negativamente?
jeton
0

Observe em Appache Collections CollectionUtils.isEmpty () retorna true se a coleção for nula ou vazia

Anastasiia Kuzina
fonte