Convertir iterador en lista
Dado Iterator<Element>
, ¿cómo podemos convertir eso convenientemente Iterator
a a List<Element>
, para que podamos usar List
operaciones de 'en él como get(index)
, add(element)
etc.?
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);
En Java 8, puedes usar el nuevo forEachRemaining
método que se agregó a la Iterator
interfaz:
List<Element> list = new ArrayList<>();
iterator.forEachRemaining(list::add);
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]
Tenga en cuenta que existe una diferencia entre Iterable
y 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 ArrayList
una 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());
También puedes usar IteratorUtils
desde Apache commons-collections , aunque no admite genéricos:
List list = IteratorUtils.toList(iterator);