2013-07-03 3 views
5

Ho un metodo che accetta un argomento Collection<Foo> foos, che potrebbe essere NULL. Voglio finire con una copia locale dell'input come ImmutableSet. In questo momento il mio codice assomiglia a questo:Modo pulito Guava per gestire la raccolta eventualmente-null

if (foos == null) 
{ 
    this.foos = ImmutableSet.of(); 
} 
else 
{ 
    this.foos = ImmutableSet.copyOf(foos); 
} 

C'è un modo più pulito per fare questo? Se foos fosse un parametro semplice, potrei fare qualcosa come Objects.firstNonNull(foos, Optional.of()) ma non sono sicuro che ci sia qualcosa di simile a gestire le raccolte.

risposta

13

non vedo il motivo per cui non si poteva usare Objects.firstNonNull:

this.foos = ImmutableSet.copyOf(Objects.firstNonNull(foos, ImmutableSet.of())); 

è possibile risparmiare qualche digitazione con le importazioni statiche, se vi piace il genere:

import static com.google.common.collect.ImmutableSet.copyOf; 
import static com.google.common.collect.ImmutableSet.of; 
// snip... 
this.foos = copyOf(Objects.firstNonNull(foos, of())); 
+5

+1 E potrebbe valere la pena sottolineare che 'copyOf' è abbastanza intelligente da restituire semplicemente l'input se è un' ImmutableSet'. –

+1

@PaulBellora Io credo che tu l'abbia appena fatto. ':)' –

+3

Anche 'ImmutableSet. di() 'potrebbe essere necessario purtroppo. –

7

Un Collection è un riferimento come un altro, così si potrebbe fare:

ImmutableSet.copyOf(Optional.fromNullable(foos).or(ImmutableSet.of())); 

Ma che sta diventando un bel pugno a scrivere. Più semplice:

foos == null ? ImmutableSet.of() : ImmutableSet.copyOf(foos); 
+0

Il secondo esempio ha il vantaggio di non creare una raccolta vuota quando non è necessaria. La risposta di MattBall creerebbe sempre il 'Set' vuoto anche se la raccolta passata non è nulla. –

+5

@JohnB 'ImmutableSet.of()' [restituisce un singleton] (http://docs.guava-libraries.googlecode.com/git/javadoc/src-html/com/google/common/collect/ImmutableSet.html# line.83). –

+0

ah, certo che lo fa! Saluti. –