sábado, 22 de septiembre de 2018

Crear una emptyList, UnsupportedOperationException y como hacerlo bien


El otro día estaba intentando iniciarlizar una lista y se me ocurrió la feliz idea de hacerlo con alguna clase de utilidad de las muchas existentes. Así que hice lo siguiente:

List<Book> exit = Collections.emptyList();
exit.add(new Book(1, "Alfred Bester", "The starts my destination"));

Obteniendo al ejecutar una preciosa excepción del tipo 'java.lang.UnsupportedOperationException'. Y es que aunque el método 'emptyList' nos pueda llevar a la impresión de que va a crear una lista vacía y luego reutilizarla, como al menos a mi me llevo. Esta lista es de caracter 'inmutable', es decir que no la podemos modificar posteriormente. 

Para este caso yo al menos conozco dos posibles soluciones. El primero sería sin hacer uso de ninguna librería de utilidad y por tanto sería a través de un constructor:

List<Book> exit = new ArrayList<>();
exit.add(new Book(1, "Alfred Bester", "The starts my destination"));

La segunda forma sería a través de alguna librería de utilidad, como puede ser Guava, de la cual ya hablamos en su día aqui.

import com.google.common.collect.Lists;
//....
List<Book> exit = Lists.newArrayList();
exit.add(new Book(1, "Alfred Bester", "The starts my destination"));

Si lo que ya se quiere es crearla e iniciarla si también multiples formas. A continuación ponemos algunas de las más comunes.

// usando java.util.Arrays
List<String> firstEx = Arrays.asList("one", "two");
firstEx.stream().forEach(System.out::println);
// usando Java 8 y Stream
List<String> secondEx = Stream.of("one", "two").collect(Collectors.toList());
secondEx.stream().forEach(System.out::println);
// usando com.google.common.collect.Lists
List<String> thirdEx = Lists.newArrayList("one", "two");
thirdEx.stream().forEach(System.out::println);

No hay comentarios:

Publicar un comentario