Convertir iterador en lista

Resuelto Maksim asked hace 12 años • 12 respuestas

Dado Iterator<Element>, ¿cómo podemos convertir eso convenientemente Iteratora a List<Element>, para que podamos usar Listoperaciones de 'en él como get(index), add(element)etc.?

Maksim avatar Apr 12 '12 10:04 Maksim
Aceptado

Es mejor utilizar una biblioteca como Guava :

import com.google.common.collect.Lists;

Iterator<Element> myIterator = ... //some iterator
List<Element> myList = Lists.newArrayList(myIterator);

Otro ejemplo de guayaba:

ImmutableList.copyOf(myIterator);

o Colecciones de Apache Commons :

import org.apache.commons.collections.IteratorUtils;

Iterator<Element> myIterator = ...//some iterator

List<Element> myList = IteratorUtils.toList(myIterator);       
Renaud avatar Jun 11 '2012 06:06 Renaud

En Java 8, puedes usar el nuevo forEachRemainingmétodo que se agregó a la Iteratorinterfaz:

List<Element> list = new ArrayList<>();
iterator.forEachRemaining(list::add);
Stuart Marks avatar Feb 13 '2015 02:02 Stuart Marks

Puede copiar un iterador a una nueva lista como esta:

Iterator<String> iter = list.iterator();
List<String> copy = new ArrayList<String>();
while (iter.hasNext())
    copy.add(iter.next());

Eso supone que la lista contiene cadenas. Realmente no existe una forma más rápida de recrear una lista a partir de un iterador; debe recorrerla manualmente y copiar cada elemento en una nueva lista del tipo apropiado.

EDITAR :

A continuación se muestra un método genérico para copiar un iterador a una nueva lista de forma segura:

public static <T> List<T> copyIterator(Iterator<T> iter) {
    List<T> copy = new ArrayList<T>();
    while (iter.hasNext())
        copy.add(iter.next());
    return copy;
}

Úselo así:

List<String> list = Arrays.asList("1", "2", "3");
Iterator<String> iter = list.iterator();
List<String> copy = copyIterator(iter);
System.out.println(copy);
> [1, 2, 3]
Óscar López avatar Apr 12 '2012 03:04 Óscar López

Tenga en cuenta que existe una diferencia entre Iterabley Iterator.

Si tiene un Iterable, entonces con Java 8 puede usar esta solución:

Iterable<Element> iterable = createIterable();
List<Element> array = StreamSupport
    .stream(iterable.spliterator(), false)
    .collect(Collectors.toList());

Como sé, Collectors.toList()crea ArrayListuna instancia.

En realidad, en mi opinión, también queda bien en una sola línea.
Por ejemplo si necesitas regresar List<Element>de algún método:

return StreamSupport.stream(iter.spliterator(), false).collect(Collectors.toList());
Dub Nazar avatar Dec 29 '2016 18:12 Dub Nazar

También puedes usar IteratorUtilsdesde Apache commons-collections , aunque no admite genéricos:

List list = IteratorUtils.toList(iterator);
yegor256 avatar Mar 20 '2013 06:03 yegor256