2012-06-26 19 views
8

Estaba buscando una solución elegante para eliminar valores nulos de una lista. Me encontré con el following post, que dice que puedo utilizar list.removeAll(Collections.singletonList(null));¿Cuál es el uso de singletonList?

Esto, sin embargo, arroja una UnsupportedOperationException, que estoy suponiendo que se debe a removeAll() está tratando de hacer alguna operación mutativo en la colección singleton inmutable. ¿Es esto correcto?

Si este es el caso, ¿cuál sería el uso típico de esta SingleList? ¿Para representar una colección de tamaño 1 cuando está seguro de que no quiere hacer nada con la colección?

Gracias de antemano.

+0

¿Cómo se declara la lista? Usando Arrays.asList()? Si es así, será inmutable – Murugesh

Respuesta

14

Funciona como un encanto:

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] 

De hecho Collections.singletonList(null) es inmutable (que es, por desgracia oculta en Java [1]), pero la excepción desde la variable de list. Parece ser que es inmutable, así, al igual que en el ejemplo a continuación:

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

Este código se lanzar una UnsupportedOperationException. Como puede ver, singletonList() es útil en este caso. Úselo cuando el código del cliente espera una lista de solo lectura (no lo modificará) pero solo quiere pasarle un elemento. singletonList() es (hilo) seguro (debido a la inmutabilidad), rápido y compacto.

[1] E.g. en hay una jerarquía separada para las colecciones mutables e inmutables y la API puede elegir si acepta esta u otra (o ambas, ya que tienen interfaces base comunes)

+0

Esto es exactamente lo que quería. No sabía que 'Arrays.asList()' devuelve una lista inmutable (aunque recuerdo haber leído que estaba "respaldado por la matriz que se pasa a él"). Esto se puede solucionar utilizando el constructor de 'ArrayList (Collection c)': 'new ArrayList (Arrays.asList (someArray)). RemoveAll (Collections.singletonList (null))' – mmoore

0

¿Su lista ha sido protegida con Collections.unmodifiableList (list) ? Porque si lo ha protegido e intentado modificarlo más tarde, obtendrá ese error.

Cuestiones relacionadas