2010-05-10 7 views
6

Quiero algo como esto:¿Hay una manera fácil de copiar un iterador en una lista en Java?

public void CopyIteratorIntoList(Iterator<Foo> fooIterator) { 
    List<Foo> fooList = new ArrayList<Foo>(); 
    fooList.addAll(fooIterator); 
} 

que debería ser equivalente a:

public void CopyIteratorIntoList(Iterator<Foo> fooIterator) { 
    List<Foo> fooList = new ArrayList<Foo>(); 
    while(fooIterator.hasNext()) 
     fooList.add(fooIterator.next()); 
} 

¿Hay algún método en la API para lograr eso, o es esta la única manera?

+0

creo que estaría bien que desee 'retorno fooList' en ese método, o pase en el fooList como un parámetro, porque de lo contrario ese método es básicamente un no-op (excepto para agotar el iterador) :) – Cowan

Respuesta

11

No, no hay nada como eso en la API estándar.

En Java, no es idiomático (y por lo tanto bastante raro) utilizar Iterator como parte de una API; por lo general se producen y se consumen de inmediato.

3

No creo que los iteradores tengan la garantía de detenerse después de un número fijo de iteraciones, por lo que probablemente no sea una forma segura de insertar datos en su lista. Considere la implementación de un iterador ficticio que siempre devuelve la constante 42 de las llamadas al next(). Su aplicación se quedará rápidamente sin memoria.

7

En Guava (nueva de propósito general de Google biblioteca de Java, que reemplaza a Google-colecciones), esto podría ser simplemente:

return Lists.newArrayList(fooIterator); 

o si la lista será de sólo lectura:

return ImmutableList.copyOf(fooIterator); 
+0

O, de hecho, Iterators.addAll (como lo sugiere Carl) si desea agregar a una colección existente. – Cowan

1

En Java 8 Puede hacerlo de esta manera:

public void CopyIteratorIntoList(Iterator<Foo> fooIterator) { 
    List<Foo> fooList = new ArrayList<Foo>(); 
    fooIterator.forEachRemaining(fooList::add); 
} 

Ver también: Easy way to change Iterable into Collection

Cuestiones relacionadas