2012-06-26 12 views
8

Stavo cercando una soluzione elegante per rimuovere i valori nulli da un elenco. Mi sono imbattuto nel following post, che dice che posso usare list.removeAll(Collections.singletonList(null));Qual è l'uso di singletonList?

Questo, tuttavia, genera un UnsupportedOperationException, che sto assumendo è perché removeAll() sta tentando di fare qualche operazione mutative sulla raccolta Singleton immutabile. È corretto?

Se questo è il caso, quale sarebbe l'uso tipico di questa singola lista? Per rappresentare una raccolta di dimensioni 1 quando sei sicuro di non voler fare effettivamente qualcosa con la collezione?

Grazie in anticipo.

+0

Come hai dichiarato la lista? Utilizzando Arrays.asList()? Se è così allora sarà immutabile – Murugesh

risposta

14

Funziona come un fascino:

List<String> list = new ArrayList<String>(); 
list.add("abc"); 
list.add(null); 
list.add("def"); 
list.removeAll(Collections.singletonList(null)); 
System.out.println(list); //[abc, def] 

Infatti Collections.singletonList(null) è immutabile (che purtroppo nascosto in Java [1]), ma l'eccezione viene generata dalla variabile list. A quanto pare è immutabile pure, come nell'esempio qui sotto:

List<String> list = Arrays.asList("abc", null, "def"); 
list.removeAll(Collections.singletonList(null)); 

Questo codice sarà lanciare un UnsupportedOperationException. Quindi come puoi vedere singletonList() è utile in questo caso. Usalo quando il codice client si aspetta un elenco di sola lettura (non lo modificherà) ma vuoi solo passare un elemento in esso. singletonList() è (thread-) sicuro (a causa dell'immutabilità), veloce e compatto.

[1] E.g. in c'è una gerarchia separata per le collezioni mutevoli e immutabili e l'API può scegliere se accettare questa o l'altra (o entrambe, poiché hanno interfacce di base comuni)

+0

Questo è esattamente quello che volevo. Non ero a conoscenza del fatto che 'Arrays.asList()' restituisce una lista immutabile (anche se ricordo di aver letto che era "supportato dall'array che è passato dentro"). Questo può essere risolto usando il costruttore di 'ArrayList (Collection c)': 'new ArrayList (Arrays.asList (someArray)). RemoveAll (Collections.singletonList (null))' – mmoore

0

La lista è stata protetta con Collections.unmodifiableList (elenco) ? Perché se lo hai protetto e provi a modificarlo più tardi, ottieni quell'errore.