Convertir Iterator a List en Java

fromIteratorToList

fromIteratorToList


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!


Deja una respuesta

Tu dirección de correo electrónico no será publicada.