Google Guava isNullOrEmpty per le raccolte


102

Vedo che Guava ha il metodo di utilità isNullOrEmpty per le stringhe

Strings.isNullOrEmpty(str)

Abbiamo qualcosa di simile per gli elenchi? Qualcosa di simile a

Lists.isNullOrEmpty(list)

che dovrebbe essere equivalente a

list == null || list.isEmpty()

Inoltre, abbiamo qualcosa di simile per gli array? Qualcosa di simile a

Arrays.isNullOrEmpty(arr)

che dovrebbe essere equivalente a

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

Risposte:


141

No, questo metodo non esiste in Guava ed è infatti nel nostro "cimitero delle idee".

Non crediamo che "è nullo o vuoto" sia una domanda che vorresti davvero porre su una collezione.

Se una raccolta potrebbe essere nulla e null dovrebbe essere trattato allo stesso modo di vuoto, elimina tutta quell'ambiguità in primo piano, in questo modo:

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

o così (se preferisci):

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

Dopodiché, puoi semplicemente usare .isEmpty()come al solito. Fallo immediatamente dopo aver chiamato l'API birichina e ti sei lasciato alle spalle la stranezza, invece di lasciarlo continuare a tempo indeterminato.

E se il "null che in realtà significa raccolta vuota" non ti viene restituito, ma passato a te, il tuo lavoro è facile: lascia che NullPointerExceptionvenga lanciato un e fai in modo che il chiamante prenda forma.


7
Cosa succede se un framework lo imposta come campo su null e non è possibile controllarlo (framework spring quando si esegue l'associazione a elenco) anche se si imposta e si utilizza esplicitamente un elenco vuoto nell'oggetto.
OMax

15
La mia risposta è la stessa: prova a rimuovere l'ambiguità normalizzandoti nulla una raccolta vuota il prima possibile. Se proprio non puoi, allora va bene, potresti essere uno di <1% di utenti che vuole davvero scrivere il proprio banale helper isNullOrEmpty (Collection).
Kevin Bourrillion

8
(o salta l'helper e scrivi if (collection == null || collection.isEmpty())nei casi in cui ne hai bisogno! È così brutto?)
Kevin Bourrillion

13
Questa è una risposta supponente che in realtà non risponde affatto alla domanda. Va anche contro i principi di programmazione difensiva.
Neovibrant

11
@Neovibrant poiché la domanda riguarda le capacità della libreria Guava, e la risposta è di uno dei principali sviluppatori di Guava, la risposta è un po 'implicita: "No, Guava non ce l'ha". La risposta potrebbe essere migliorata iniziando con questa affermazione :)
Grundlefleck

37

Una cosa che tenderai a trovare in tutta Guava è che tendono ad essere molto antagonisti verso nulls. Gli autori vogliono scoraggiarti nulldall'usare quanto probabilmente fai, e fornire metodi di utilità per renderlo più facile da usare nullsarebbe controproducente contro questo scopo.

Se vuoi usare il paradigma di Guava, considera se l'origine di questa raccolta (o array) dovrebbe davvero tornare facoltativamente null. In caso contrario, valuta la possibilità di contrassegnarlo @NonNulle restituisci raccolte vuote anziché null. Oppure come parametro di una funzione che non nullprevede elenchi di valori, considera l'utilizzo Preconditions.checkNotNull, che genera un'eccezione se nullviene (inaspettatamente) passato.

Se nullè davvero legittimo, list == null || list.isEmpty()non è così difficile.


9
è incoerente. Lo stesso argomento potrebbe essere fatto per archi, eppure è uno Strings.isNullOrEmpty ()
Don Cheadle

29

C'è un CollectionUtils.isEmpty () in commons-collections.


1
Sfortunatamente, sembra che sia stato rimosso nelle versioni più recenti. Vedere org.apache.commons.collections15.CollectionUtils.
spaaarky21

1
Guardando Javadoc da apache.commons.collection, i metodi isEmpty () e isNotEmpty () esistono ancora nell'ultima versione. collections15.CollectionUtils sembra un progetto indipendente che cerca di fornire un supporto generico.
proko

1
CollectionUtils.isEmpty () è utile quando si lavora con app legacy, quando non è possibile modificare il codice iniziale.
Jerome Dalbert

1
lo sappiamo, ma si chiedeva del guava non degli apache commons.
Al Kra

9

Spring Framework ha una classe util specializzata chiamata CollectionUtils. E il metodo che si sta cercando è: org.springframework.util.CollectionUtils.isEmpty. Restituisce true per le raccolte null e vuote.

E per gli array esiste un org.springframework.util.ObjectUtils.isEmptymetodo che si comporta allo stesso modo.


5
Sebbene sia probabilmente sicuro da usare, questa classe è contrassegnata con il commento "Principalmente per uso interno all'interno del framework". Ciò significa che la sua interfaccia potrebbe cambiare con un aggiornamento di primavera e dovrai fare del lavoro aggiuntivo per farlo funzionare di nuovo.
Mike Minicki

2

Apache CollectionUtils 4 ha un metodo CollectionUtils.emptyIfNull () che restituisce un elenco vuoto se la raccolta è null. Questo è molto utile in un ciclo foreach, quindi non è necessario eseguire un controllo nullo prima di iterare


1

La mia soluzione è: MoreObjects.firstNonNull (list, Collections. EmptyList ())

Sto usando Guava MoreObjects con le raccolte 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
Questo è esattamente ciò che viene suggerito nella risposta in alto , tranne per il fatto che non usi un ImmutableList.
dimo414

Penso negativo perché si voleva una soluzione semplice e veloce come i metodi Apache commons inNotEmpty ...
To Kra

Centro assistenza> Privilegi> Voto negativo Quando devo votare? Usa i tuoi voti negativi ogni volta che incontri un post incredibilmente sciatto, senza sforzi o una risposta che è chiaramente e forse pericolosamente errata. Hai un numero limitato di voti al giorno e rispondere ai voti negativi ti costa un po 'di reputazione oltre a quello; usali con saggezza. stackoverflow.com/help/privileges/vote-down
jeton

Pensi che la mia risposta sia "un post eccessivamente sciatto, senza sforzi, o una risposta che è chiaramente e forse pericolosamente errata"? In caso contrario, perché votate negativo?
jeton

0

Guarda le raccolte di appache CollectionUtils.isEmpty () restituisce true se la raccolta è nulla o vuota

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.