Convertir Iterator a List en Java
En esta nueva entrada de refactorizando vamos a ver como convertir Iterator a List en Java, de una manera tradicional, con Streams y haciendo uso de alguna librería adicional como Guava y Apache Commons. Anteriormente ya exploramos el API de Streams de Java con algún otro artículo que puedes ver aquí.
Para todos los ejemplos que vamos a explicar a continuación vamos a partir de los siguientes datos:
Iterator<String> iterator = Arrays.asList("Orange", "Blue", "Green").iterator();
Convertir Iterator a List con bucle While
La manera más tradicional y quizás más conocida para transformar un iterator a List es hacerlo con while. Haciendo uso de la propiedad hasNext(), nos indicará el final del iterator, con lo que el bucle finalizará.
List<String> actualList = new ArrayList<>(); while (iterator.hasNext()) { actualList.add(iterator.next()); }
Convertir Iterator a List con Streams de Java
Para convertir cualquier Objeto Iterator a una lista haciendo uso del API de Streams vamos a apoyarnos en StreamSupport. La cual nos proporciona métodos para poder manipular y convertir streams.
List<String> actualList = StreamSupport.stream( Spliterators.spliteratorUnknownSize(iterator, 0), false) .collect(Collectors.toList());
Convertir Iterator a List forEachRemaining
forEachRemaining es un método que se añadio a partir de Java 8, y nos va a permitir la modificación y construcción de nuestra lista. Con este método, que se podría decir que es como un for, se procesa cada elemento hasta que no quedan más.
List<String> actualList = new ArrayList<>(); iterator.forEachRemaining(actualList::add);
Convertir Iterator a List con Guava
Guava es un conjunto de librerías open-source escritas para java y se encuentran mantenidas y desarrolladas por Google. Entre estas librerías podemos encontrar alguna que nos facilitará el trabajo con colecciones en Java.
Para poder utilizar esta librería habrá que añadir la siguiente dependencia en tu pom.xml :
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>30.1-jre</version> </dependency>
o con gradle:
compile group: 'com.google.guava', name: 'guava', version: '30.1-jre'
Esta librería nos permitira transformar un iterator a una lista inmutable y/o mutable, veamoslo con un ejemplo.
List<String> actualList = ImmutableList.copyOf(iterator);
List<String> actualList = Lists.newArrayList(iterator);
Convertir Iterator a List con Apache Commons.
Y ahora vamos con la más que conocida y antigua librería Apache Commons, la cual nos ayuda a tratar con colecciones en Java desde hace mucho tiempo. Y nos ayuda a reducir el boilerplate en nuestro código.
Para poder hacer uso de esta librería tendrás que añadir en tu pom.xml la siguiente librería:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.4</version> </dependency>
O si estas trabajando con gradle:
compile group: 'org.apache.commons', name: 'commons-collections4', version: '4.4'
Para hacer la transformación de un iterator a List vamos a utilizar IteratorList, la cual hace la transformación directa:
List<String> actualList = IteratorUtils.toList(iterator); assertEquals(actualList, auxList);
Ejemplos con Test
A continuación mostramos todos los ejemplos con test:
public class IteratorExamples{ Iterator<String> iterator = Arrays.asList("Orange", "Blue", "Green").iterator(); List<String> auxList = List.of("Orange", "Blue", "Green"); @Test public void transformToListWithWhile() { List<String> actualList = new ArrayList<>(); while (iterator.hasNext()) { actualList.add(iterator.next()); } assertEquals(actualList, auxList); } @Test public void transformToListWithAPIStream() { List<String> actualList = StreamSupport.stream( Spliterators.spliteratorUnknownSize(iterator, 0), false) .collect(Collectors.toList()); assertEquals(actualList, auxList); } @Test public void transformToListWithInmutableGuava() { List<String> actualList = ImmutableList.copyOf(iterator); assertEquals(actualList, auxList); } @Test public void transformToListWithMutableGuava() { List<String> actualList = Lists.newArrayList(iterator); assertEquals(actualList, auxList); } @Test public void transformToListWithApacheCommons() { List<String> actualList = IteratorUtils.toList(iterator); assertEquals(actualList, auxList); } @Test public void transformToListWithForEachRemaining() { List<String> actualList = new ArrayList<>(); iterator.forEachRemaining(actualList::add); } }
Conclusión
Como hemos podido ver en esta sobre como convertir Iterator a List en Java, tenemos diferentes formas de poder realizar transformaciones en colecciones con diferentes librerías.
Si tienes alguna duda no dudes en contactar a través de un comentario un e-mail, o en nuestras redes sociales.
No te olvides de seguirnos en nuestras redes sociales Facebook o Twitter para estar actualizado.
Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com y te ayudaremos encantados!